android多线程断点续传原理解析

在下载大文件的时候,我们往往要使用多线程断点续传,保证数据的完整性

下面我来解析一下多线程断点续传的原理

首先说多线程,我们要多线程下载一个大文件,就有开启多个线程,多个connection,既然是一个文件分开几个线程来下载,那肯定就是一个线程下载一个部分,不能重复

那么我们这么确定一个线程下载一部分呢

就需要我们在请求的header里面设置

conn.setRequestProperty("Range", "bytes="+startPos+"-"+endPos);

这里startPos是指从数据端的哪里开始,endPos是指数据端的结束

根据这样我们就知道,只要多个线程,按顺序指定好开始跟结束,就可以不冲突的下载了

那么我们写文件的时候又该怎么写呢

byte[] buffer = new byte[1024];
int offset = 0;
print("Thread "+this.threadId+" starts to download from position "+startPos);
RandomAccessFile threadFile = new RandomAccessFile(this.saveFile,"rwd");
threadFile.seek(startPos);
...
threadFile.write(buffer,0,offset);

从上面代码可以看出,每个线程找到自己开始写的位置,就是seek(startPos)

这样就可以保证数据的完整性,也不会重复写入了


基本上多线程的原理就是这样,其实也很简单

那么我们接着说断点续传,断点续传其实也很简单,原理就是使用数据库保存上次每个线程下载的位置和长度

例如我开了两个线程T1,T2来下载一个文件,设文件总大小为1024M,那么就是每个线程下载512M

可是我的下载中断了,那么我下次启动线程的时候(继续下载),是不是应该要知道,我原来下载了多少呢

所以是这样的,我没下载一点,就更新数据库的数据,

例如T1,下载了100M,就要实时更新数据库,记录下100M,并且记录下这个线程开始下载位置(startPos),还有线程负责的长度(512M)

那么我继续下载的时候,就可以像服务器请求startPos+1000M开始的数据了,然后在文件里面也是seek(startPos+1000M)的位置继续下载,就可以实现断点续传了


OK,原理到这里就结束了,顺便提一句,在实际过程中,我们往往要使用进度条提示下载进度

这是我们可以启动一个线程,专门负责进度的更新,并且实时监听T1,T2线程的情况,

所以我们最好建立一个LISTNER接口比较方便,当然,这就比较简单了


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值