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



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

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

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

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

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

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

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

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

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

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

  1. byte[] buffer = new byte[ 1024];
  2. int offset = 0;
  3. print( "Thread "+ this.threadId+ " starts to download from position "+startPos);
  4. RandomAccessFile threadFile = new RandomAccessFile( this.saveFile, "rwd");
  5. threadFile.seek(startPos);
  6. ...
  7. 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多线程断点续传原理解析

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

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

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

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

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

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

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

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

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

  1. byte[] buffer = new byte[ 1024];
  2. int offset = 0;
  3. print( "Thread "+ this.threadId+ " starts to download from position "+startPos);
  4. RandomAccessFile threadFile = new RandomAccessFile( this.saveFile, "rwd");
  5. threadFile.seek(startPos);
  6. ...
  7. 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接口比较方便,当然,这就比较简单了

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

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

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

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

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

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

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

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

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

  1. byte[] buffer = new byte[ 1024];
  2. int offset = 0;
  3. print( "Thread "+ this.threadId+ " starts to download from position "+startPos);
  4. RandomAccessFile threadFile = new RandomAccessFile( this.saveFile, "rwd");
  5. threadFile.seek(startPos);
  6. ...
  7. 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接口比较方便,当然,这就比较简单了

猜你喜欢

转载自blog.csdn.net/xinzhou201/article/details/80973344
今日推荐