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

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

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

我们编写的是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"        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实现网络多线程断点续传下载功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存