有时候 会遇到这样的需求:实现多线程的断点续传。今天就我平时的一些实战的经验 来给大家写一个多线程断点续传的例子,希望对大家有所帮助。
一、多线程下载的原理
基本原理
多线程下载:
如图:
其最上边的绿色方块代表我们要下载的完整文件 多线程下载的基本原理就是由一个完整的文件分成几个不同部分,然后分别由不同的线程去下载这几个部分,把它下载到本地之后,我们将其进行合并,合并完成之后就能得到完整的文件
断点续传:
如图:
第一次下载时我们下载这么多(如图)假如遇到了网络状态不太好或者用户手动中止了下载,这时,我们的下载不能顺利的进行下去,于是我们需要进行第二次下载。
在传统的下载过程中我们第二次下载和第一次下载一样 需要从新开始进行下载,但是有了断点续传 ,我们记录第一次下载的位置,第二次下载的时候从断点处开始下载。
1.如何从服务器获取部分文件
断点续传我们要解决的是如何告诉服务器我们需要的文件的位置(从哪里到哪里),这个就涉及到了http协议的问题,在向服务器发送请求的过程中,要用一个 http header,这个会制定我们的请求的要求,在这里 我们要使用的是range ,用来制定我们需要的位置(Range : bytes=0-500).
2.文件的合并
还有个一我们需要解决的问题就是我们下载下来的这几部分如何合并,这里给出两种方案:
一、RandomAccessFile
他可以让我们从文件的某一个位置开始读写
二、先下载到几个文件中,最后合并
本次 我们使用RandomAcceeFile
首先,我们先把布局文件写出来
如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/FileUrl" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ProgressBar style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal" android:id="@+id/progress" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_down" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>好了,写好布局之后 我们开始要写重要的一些逻辑了(重点)