全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android实现网络多线程断点续传下载功能

我们编写的是Andorid的HTTP协议多线程断点下载应用程序。直接使用单线程下载HTTP文件对我们来说是一件非常简单的事。那么,多线程断点需要什么功能?

1.多线程下载
2.支持断点

使用多线程的好处:使用多线程下载会提升文件下载的速度

原理

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

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

封装

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

分配线程

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

线程下载

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

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.example.linux.continuedownload.MainActivity">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
  <TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

  <TextView
    android:layout_marginLeft="80dp"
    android:id="@+id/progress"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

  <TextView
    android:layout_marginLeft="80dp"
    android:id="@+id/speed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
  </LinearLayout>
  <ProgressBar
    android:visibility="invisible"
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
      android:id="@+id/start"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="开始下载" />

    <Button
      android:layout_marginLeft="20dp"
      android:id="@+id/stop"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="暂停下载" />

    <Button
      android:layout_marginLeft="20dp"
      android:id="@+id/cancel"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="取消下载" />
  </LinearLayout>

</LinearLayout>

在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文件中声明权限,定义服务

<service android:name="com.huhx.services.DownloadService" android:exported="true" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


总结

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # 多线程  # 断点续传  # 下载  # Android多线程断点续传下载实现代码  # Android 使用AsyncTask实现多线程断点续传  # Android 使用AsyncTask实现多任务多线程断点续传下载  # android实现多线程断点续传功能  # Android多线程断点续传下载示例详解  # Android多线程+单线程+断点续传+进度条显示下载功能  # android实现多线程下载文件(支持暂停、取消、断点续传)  # Android实现网络多线程断点续传下载实例  # Android实现多线程断点续传  # 绑定  # 下载速度  # 越多  # 进行下载  # 的是  # 也就  # 将其  # 我们可以  # 可以通过  # 要知道  # 可以使用  # 二个  # 越快  # 大家多多  # 单线程  # 应用程序  # 再对  # 类中  # 再写 


相关文章: 建站之星收费标准详解:套餐费用及年费价格表一览  制作网站的公司有哪些,做一个公司网站要多少钱?  网站制作的步骤包括,正确网址格式怎么写?  西安大型网站制作公司,西安招聘网站最好的是哪个?  制作电商网页,电商供应链怎么做?  如何用景安虚拟主机手机版绑定域名建站?  网站设计制作企业有哪些,抖音官网主页怎么设置?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  完全自定义免费建站平台:主题模板在线生成一站式服务  如何确保FTP站点访问权限与数据传输安全?  官网网站制作腾讯审核要多久,联想路由器newifi官网  如何用IIS7快速搭建并优化网站站点?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  微课制作网站有哪些,微课网怎么进?  建站主机是什么?如何选择适合的建站主机?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  深入理解Android中的xmlns:tools属性  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  建站之星后台管理:高效配置与模板优化提升用户体验  如何构建满足综合性能需求的优质建站方案?  如何在阿里云高效完成企业建站全流程?  建站主机与虚拟主机有何区别?如何选择最优方案?  小型网站制作HTML,*游戏网站怎么搭建?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  建站之星伪静态规则如何正确配置?  网站制作说明怎么写,简述网页设计的流程并说明原因?  红河网站制作公司,红河事业单位身份证如何上传?  如何在宝塔面板创建新站点?  如何选择网络建站服务器?高效建站必看指南  如何通过远程VPS快速搭建个人网站?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  定制建站是什么?如何实现个性化需求?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  ,网页ppt怎么弄成自己的ppt?  如何配置WinSCP新建站点的密钥验证步骤?  已有域名和空间如何搭建网站?  建站之星在线版空间:自助建站+智能模板一键生成方案  如何用AWS免费套餐快速搭建高效网站?  ppt制作免费网站有哪些,ppt模板免费下载网站?  如何使用Golang table-driven基准测试_多组数据测量函数效率  网站制作价目表怎么做,珍爱网婚介费用多少?  如何在香港服务器上快速搭建免备案网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何在IIS中新建站点并配置端口与IP地址? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。