• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android中的多线程断点下载,android断点下载

Android中的多线程断点下载,android断点下载

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android 断点续传,android 断点下载,android断点续传原理,android断点续传下载,android studio 断点等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android中的多线程断点下载,android断点下载


      首先来看一下多线程下载的原理。多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序“拼接”起来就构
成了完整的文件了。这样就大大提高了文件的下载效率。对于文件下载来说,多线程下载是必须要考虑的环节。

      多线程下载大致可分为以下几个步骤:

       一.获取服务器上的目标文件的大小
              显然这一步是需要先访问一下网络,只需要获取到目标文件的总大小即可。目的是为了计算每个线程应该分配的下载任务。

      二. 在本地创建一个跟原始文件同样大小的文件
             在本地可以通过RandomAccessFile 创建一个跟目标文件同样大小的文件,该api 支持文件任意位置的读写操作。这样就给多线程下载提供了方便,每个线程只需在指定起始和结束脚标范围内写数据即可。

      三.计算每个线程下载的起始位置和结束位置
             我们可以把原始文件当成一个字节数组,每个线程只下载该“数组”的指定起始位置和指定结束位置之间的部分。在第一步中我们已经知道了“数组”的总长度。因此只要再知道总共开启的线程的个数就好计算每个线程要下载的范围了。每个线程需要下载的字节个数(blockSize)=总字节数(totalSize)/线程数(threadCount)。       假设给线程按照0,1,2,3...n 的方式依次进行编号,那么第n 个线程下载文件的范围为:
               起始脚标startIndex=n*blockSize。
              结束脚标endIndex=(n-1)*blockSize-1。
            考虑到totalSize/threadCount 不一定能整除,因此对已最后一个线程应该特殊处理,最后一个线程的起始脚标计算公式不变,但是结束脚标为endIndex=totalSize-1即可。
     四.开启多个子线程开始下载
            在子线程中实现读流操作,将conn.getInputStream()读到RandomAccessFile中。
     五.记录下载进度
           为每一个单独的线程创建一个临时文件,用于记录该线程下载的进度。对于单独的一个线程,每下载一部分数据就在本地文件中记录下当前下载的字节数。这样子如果下载任务异常终止了,那么下次重新开始下载时就可以接着上次的进度下载。
     六. 删除临时文件
           当多个线程都下载完成之后,最后一个下载完的线程将所有的临时文件删除。

        Android有界面可以跟用户进行良好的交互,在界面上让用户输入原文件地址、线程个数,然后点击确定开始下载。为了让用户可以清晰的看到每个线程下载的进度根据线程个数动态的生成等量的进度条(ProgressBar)。ProgressBar 是一个进度条控件,用于显示一项任务的完成进度。其有两种样式,一种是圆形的,该种样式是系统默认的,由于无法显示具体的进度值,适合用于不确定要等待多久的情形下;另一种是长条形的,此类进度条有两种颜色,高亮颜色代表任务完成的总进度。对于我们下载任务来说,由于总任务(要下载的字节数)是明确的,当前已经完成的任务(已经下载的字节数)也是明确的,因此特别适合使用后者。由于在我们的需求里ProgressBar 是需要根据线程的个数动态添加的,而且要求是长条形的。因此可以事先在布局文件中编写好ProgressBar 的样式。当需要用到的时候再将该布局填充起来。ProgressBar 的max 属性代表其最大刻度值,progress 属性代表当前进度值。使用方法如下:
           ProgressBar.setMax(int max);设置最大刻度值。
           ProgressBar.setProgress(int progress);设置当前进度值。
       给ProgressBar 设置最大刻度值和修改进度值可以在子线程中操作的,其内部已经特殊处理过了,因此不需要再通过handler发送Message 让主线程修改进度。

      下面就给出我们自己写的安卓环境下的多线程。

       多线程下载界面布局如下,三个进度条分别表示三个子线程的下载进度。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/et_path"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入要下载的文件资源路径"
        android:text="http://192.168.1.104:8080/gg.exe" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="download"
        android:text="下载" />

    <ProgressBar
        android:id="@+id/pb0"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ProgressBar
        android:id="@+id/pb1"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ProgressBar
        android:id="@+id/pb2"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

 

      多线程下载的内部逻辑如下,其实这在开头已经了,只不过是代码的实现了。

public class MainActivity extends Activity {
    private EditText et_path;
    private ProgressBar pb0;
    private ProgressBar pb1;
    private ProgressBar pb2;
    /**
     * 开启几个线程从服务器下载数据
     */
    public static int threadCount = 3;

    public static int runningThreadCount;
    private String path;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        et_pa



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android中的多线程断点下载,android断点下载

相关文章

  • 2017-05-26Android实战简易教程-第六十六枪(服务器端搭建和服务器端Json数据交互)
  • 2017-05-26【开源】二维码签到手机andriod版下载!,开源签到andriod
  • 2017-05-26Android Volley框架的使用(5),androidvolley
  • 2017-05-26安卓开源项目周报0104,安卓开源项目0104
  • 2017-05-26Android常用命令行-ADB,android-adb
  • 2017-09-18Android开发简单服务器
  • 2017-05-26Android多分辨率适配实践【1】使用字体图标(内含两枚神器),android两枚
  • 2017-05-26Android 手机卫士8--删除通话记录,android8--
  • 2018-01-28Android Studio 错误解决办法
  • 2017-05-222.6.0 其他几种常用对话框基本使用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android 手机卫士--获取联系人信息并显示与回显,android回显
    • Android开发通用的工具类
    • Android开发学习之路--RxAndroid之lambda
    • VS2015墙内创建ionic2,vs2015墙ionic2
    • ListView的&#160;addHeaderView,addheaderview
    • overridePendingTransition,transition
    • 仿Android印象笔记底部导航栏
    • android6.0 adbd深入分析(四)adbd usb线拔掉再连接的过程
    • 编译器开发系列--Ocelot语言2.变量引用的消解,编译器--ocelot
    • 我的android学习经历6,android学习经历6

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有