怎么在Android应用中实现一个网络多线程断点续传下载功能

怎么在Android应用中实现一个网络多线程断点续传下载功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

成都创新互联公司是一家专业提供宜城企业网站建设,专注与网站设计、成都网站设计成都h5网站建设、小程序制作等业务。10年已为宜城众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。

原理

多线程下载的原理就是将要下载的文件分成若干份,其中每份都使用一个单独的线程进行下载,这样对于文件的下载速度自然就提高了许多。

既然要分成若干部分分工下载,自然要知道各个线程自己要下载的起始位置,与要下载的大小。所以我们要解决线程的分配与各个线程定位到下载的位置。

封装

对于多线程下载我们可以将其封装到一个工具类中DownUtil,向其中传入下载的链接、文件存储路径、需要下载的线程数

分配线程

这里通过HttpURLConnection进行网络请求下载,通过getContentLength()方法获取下载文件的总大小,再对其平均分配各个线程需要下载的大小。这样就确定了下载的大小,下面就是定位到各个线程的开始位置进行下载,这里可以使用RandomAccessFile来追踪定位到要下载的位置,它的seek()方法可以进行定位。

线程下载

下面就是各个线程的下载DownThread,上面已经得到了各个线程要下载的初始位置,所以可以通过获取网络请求的输入流InputStream,通过skip()方法跳跃到指定位置进行读取数据,再写入到RandomAccessFile文件中

一、 编写基本的UI,三个TextView,分别显示文件名、下载进度和下载速度,一个ProgressBar。二个Button,分别用于开始下载、暂停下载和取消下载。




  
  

  

  
  
  

  

    

在onCreate方法中绑定开始下载按钮事件:点击start按钮,设置进度条可见,并且设置start的Action,启动服务。

startButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    textView.setText(fileInfo.getFileName());
    progressBar.setVisibility(View.VISIBLE);
    // 通过Intent传递参数给service
    Intent intent = new Intent(MainActivity.this, DownloadService.class);
    intent.setAction(DownloadService.ACTION_START);
    intent.putExtra("fileInfo", fileInfo);
    startService(intent);
  }
});

在onCreate方法中绑定暂停下载按钮事件:点击stop按钮,设置stop的Action,启动服务。

stopButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    // 通过Intent传递参数给service
    Intent intent = new Intent(MainActivity.this, DownloadService.class);
    intent.setAction(DownloadService.ACTION_STOP);
    intent.putExtra("fileInfo", fileInfo);
    startService(intent);
  }
});

在onCreate方法中绑定取消下载按钮事件:点击cancel按钮,设置cancel的Action,启动服务,之后更新UI。

cancelButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    // 通过Intent传递参数给service
    Intent intent = new Intent(MainActivity.this, DownloadService.class);
    intent.setAction(DownloadService.ACTION_CANCEL);
    intent.putExtra("fileInfo", fileInfo);
    startService(intent);

    // 更新textView和progressBar的显示UI
    textView.setText("");
    progressBar.setVisibility(View.INVISIBLE);
    progressView.setText("");
    speedView.setText("");
  }
});

注册广播,用于Service向Activity传递一些下载进度信息:

// 静态注册广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(DownloadService.ACTION_UPDATE);
registerReceiver(broadcastReceiver, intentFilter);

/**
 * 更新UI
 */
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    if (DownloadService.ACTION_UPDATE.equals(intent.getAction())) {
      int finished = intent.getIntExtra("finished", 0);
      int speed = intent.getIntExtra("speed", 0);

      Log.i("Main", finished + "");
      progressBar.setProgress(finished);
      progressView.setText(finished + "%");
      speedView.setText(speed + "KB/s");
    }
  }
};

三、 在AndroidManifest.xm文件中声明权限,定义服务




总结

多线程的关键就是分配好需要下载的进程,定位进程下载的准确位置,获取输入流读取数据,同时写入到文件的相应位置。可以借助RandomAccessFile来进行定位。

当然也并非开的线程数越多下载的速度也就越快,因为线程越多对于程序处理这些线程也是一种负担,过多的话反而会降低下载的速度,所以要合理运用。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。


本文名称:怎么在Android应用中实现一个网络多线程断点续传下载功能
文章网址:http://pwwzsj.com/article/gogjpd.html