android多线程断点续传原理解析
来源:互联网 发布:mac flac mp3 批量转 编辑:程序博客网 时间:2024/06/15 17:57
在下载大文件的时候,我们往往要使用多线程断点续传,保证数据的完整性
下面我来解析一下多线程断点续传的原理
首先说多线程,我们要多线程下载一个大文件,就有开启多个线程,多个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接口比较方便,当然,这就比较简单了
- android多线程断点续传原理解析
- Android多线程断点续传原理解析
- Android实现网络多线程断点续传下载原理
- 多线程下载,断点续传原理解析和代码实现
- android多线程断点续传
- android多线程断点续传
- Android多线程断点续传
- android 多线程断点续传下载
- android多线程断点续传
- Android多线程断点续传
- android 多线程断点续传
- Android多线程.断点续传下载
- android 多线程断点续传下载
- Android 多线程断点续传
- Android 多线程下载断点续传
- Android多线程断点续传下载
- android 多线程断点续传
- Android实现多线程断点续传
- 最优控制与姿控喷流在导弹姿态控制中的应用
- Maximum Depth of Binary Tree
- Hbase官方文档中文版
- 图识线程与进程
- 新浪-InSAR博客网址Blog of Jerome Cheung
- android多线程断点续传原理解析
- Nginx 因 Selinux 服务导致无法远程访问
- [LeetCode]Palindrome Partitioning
- 利用stm32自带的正交编码器检测增量式编码器流程总结
- android5下cocos2dx不能播放背景音乐
- 复数的相加相减
- fail-fast机制(遍历的同时删除List中的对象)
- git 记住用户名密码
- C语言(八)