Android使用多线程实现断点下载

2019-12-10 18:32:23于丽
易采站长站为您分析Android使用多线程实现断点下载,多线程下载是加快下载速度的一种方式,感兴趣的小伙伴们可以参考一下  

多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务..可以使任务的执行速度变快..多线程的任务下载时常都会使用得到..比如说我们手机内部应用宝的下载机制..一定是通过使用了多线程创建的下载器..并且这个下载器可以实现断点下载..在任务被强行终止之后..下次可以通过触发按钮来完成断点下载...那么如何实现断点下载这就是一个问题了..

  首先我们需要明确一点就是多线程下载器通过使用多个线程对同一个任务进行下载..但是这个多线程并不是线程的数目越多,下载的速度就越快..当线程增加的很多的时候,单个线程执行效率也会变慢..因此线程的数目需要有一个限度..经过楼主亲自测试..多线程下载同一个任务时,线程的数目5-8个算是比较高效的..当线程的数量超过10个之后,那么多线程的效率反而就变慢了(前提:网速大体相同的时候..)

  那么在实现多线程下载同一个任务的时候我们需要明白其中的道理..下面先看一张附加图..

Android,多线程,断点下载

  这个图其实就很简单的说明了其中的原理..我们将一个任务分成多个部分..然后开启多个线程去下载对应的部分就可以了..那么首先要解决的问题就是如何使各自的线程去下载各自对应的任务,不能越界..那么我们来看看具体的实现过程..首先我们使用普通Java代码去实现..最后将Java代码移植到Android就可以了..

public class Download {

  public static int threadCount = 5;  //线程开启的数量..
  public static void main(String[] args) {
    // TODO Auto-generated method stub

    String path = "http://www.easck.com/jdk.exe";
    try {
      URL url = new URL(path);
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setRequestMethod("GET");
      conn.setConnectTimeout(5000);
      int status = conn.getResponseCode();
      
      if(status == 200){
        int length = conn.getContentLength();
      
        System.out.println(length);
        
        int blocksize = length/threadCount; //将文件长度进行平分..
        
        for(int threadID=1; threadID<=threadCount;threadID++){
          
          int startIndex = (threadID-1)*blocksize; //开始位置的求法..
          int endIndex = threadID*blocksize -1;   //结束位置的求法..
           
          /**
           * 如果一个文件的长度无法整除线程数..
           * 那么最后一个线程下载的结束位置需要设置文件末尾..
           * */
          if(threadID == threadCount){        
            endIndex = length;           
          }
          
          System.out.println("线程下载位置:"+startIndex+"---"+endIndex);
        }
      }
      
      
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}