Android实现多线程断点下载

作者:qinwei1993 时间:2023-08-11 00:45:28 

QDownload

QDownload是基于Android平台实现的下载框架。API简洁易上手,只需5分钟即可实现一个多任务、多线程、断点下载的功能

支持功能如下:

支持多个下载任务同时下载单个任务支持开多个线程下载支持断点下载,在断网、进程被划掉可恢复下载自动校验服务器文件服务器是否支持断点下载,如果不支持则会开启单线程任务下载支持应用全局监听下载进度回调支持下载速度显示支持添加下载任务,暂停下载,恢复下载,取消下载支持批量暂停,批量恢复下载

先贴个效果图

主页

Android实现多线程断点下载

多任务多线程断点下载页面

Android实现多线程断点下载

1、如何使用

1.1、导入依赖

implementation 'com.qw.download:download:1.0.0-alpha01'

1.2、初始化下载组件

public class MyApplication extends Application{
   @Override
   public void onCreate() {
       super.onCreate();
       //初始化下载组件(可在子线程中做)
       DownloadManager.init(this);
   }    
}

1.3、核心控制器DownloadManager

api如下

public class DownloadManager {
   private static DownloadManager mInstance;
   private final Context context;

private DownloadManager(Context context) {}
   //初始化组件
   public static void init(Context context) {}
   //开启下载
   public static void add(DownloadEntry entry) {}  
   //暂停下载
   public static void pause(DownloadEntry entry) {}    
   //暂停所有任务
   public static void pauseAll() {}
   //恢复下载
   public static void resume(DownloadEntry entry) {}  
   //恢复所有任务
   public static void recoverAll() {}
}

1.4、监听下载进度

需要监听下载进度可通过注册DownloadWatcher来监听下载信息的变化

private DownloadWatcher watcher = new DownloadWatcher() {
   @Override
   protected void onDataChanged(DownloadEntiry entry) {
   //这里监听下载的实时信息
       mDownloadInfoLabel.setText(entry.toString());
       Log.e("MainActivity", entry.toString());
   }
};

@Override
protected void onResume() {
   super.onResume();
   //注册观察者
   DownloadManager.addObserver(watcher);
}

@Override
protected void onPause() {
   super.onPause();
   //移除观察者
   DownloadManager.removeObserver(watcher);
}

其中第3DownloadEntiry entry 存储了下载相关信息

public class DownloadEntry implements Serializable {
   public String id;//下载的唯一标识
   public String url;//下载文件的url地址
   public boolean isSupportRange;//是否支持断点续传
   public long contentLength;//文件长度
   public long currentLength;//已下载文件长度
   public State state;//任务状态
   public HashMap<Integer, Long> ranges;//存储每个线程下载开始区块
   public int speed;//下载速度 单位s
}

其中state有如下几个值

public enum State {
   IDLE,//空闲
   CONNECT,//连接中(用户预取文件信息)
   ING,//下载中
   PAUSED,//已暂停
   CANCELLED,//已取消
   ERROR,//错误
   DONE,//完成
   WAIT//等待
}

1.5、下载相关的操作

添加一个下载

通过DownloadEntry构建下载实体


public void addDownload(String id,String url){
   //id为任务的一个唯一标识,url为文件地址
   DownloadEntry entry = DownloadEntry.obtain(id,url)
   //添加一个下载任务
   DownloadManager.add(entry)    
}

暂停下载

可通过下载任务id 然后调用DownloadManager.findById(id) 函数获取DownloadEntry

public void pauseDownload(DownloadEntry entry){
   //添加一个下载任务
   DownloadManager.pause(entry)    
}

恢复下载

public void resumeDownload(DownloadEntry entry){
   //添加一个下载任务
   DownloadManager.resume(entry)    
}

暂停所有下载任务

public void pauseAll(DownloadEntry entry){
   //添加一个下载任务
   DownloadManager.resume(entry)    
}

恢复所有下载任务

public void recoverAll(DownloadEntry entry){
   //添加一个下载任务
   DownloadManager.recoverAll(entry)    
}

1.6、应用市场apk下载的一个场景

ApkEntry实体数据用来描述apk的基本信息

public class ApkEntry {
   public String id;//包id
   public String cover;//apk 图标
   public String name;//apk 名称
   public String url;//apk 下载地址
   public long length;//apk 大小

public String id() {
       if (TextUtils.isEmpty(id)) {
           //如果服务端没有返回唯一标记则用url的md5值作为下载唯一标识
           id = FileUtilities.getMd5FileName(url);
       }
       return id;
   }
}

这是我要下载这个apk就可以这么做

public void downloadApk(ApkEntry apkEntry){
   //1、先check当前apk是否在下载
   DownloadEntry entry = DownloadManager.findById(apkEntry.id())
   if(entry==null || entry.state==State.PAUSED || entry.state==State.ERROR || entry.state==State.CANCELLED){
       //这四种情况:没有下载任务 || 任务是暂停 || 下载失败 || 任务已被取消
       DownloadManager.add(entry)
   }
}

暂停apk下载

public void pauseDownloadApk(ApkEntry apkEntry){
   //1、先check当前apk是否在下载任务中
   DownloadEntry entry = DownloadManager.findById(apkEntry.id())
   if(entry!=null){
       DownloadManager.pause(entry)
   }
}

来源:https://blog.csdn.net/qinwei1993/article/details/122736738

标签:Android,多线程,断点,下载
0
投稿

猜你喜欢

  • springMVC实现图形验证码(kaptcha)代码实例

    2022-02-14 22:02:14
  • Java Kafka实现延迟队列的示例代码

    2022-01-11 16:32:11
  • Java中的this、package、import示例详解

    2021-06-10 10:37:50
  • JAVA注解代码详解一篇就够了

    2022-12-27 14:45:26
  • Android编程之ICS式下拉菜单PopupWindow实现方法详解(附源码下载)

    2021-07-30 00:27:24
  • Unity实现UI光晕效果(发光效果)

    2022-07-08 16:37:41
  • Java通过反射,如何动态修改注解的某个属性值

    2022-08-22 04:10:51
  • C#使用GZipStream解压缩数据文件的方法

    2022-09-22 15:40:34
  • C#利用Openxml读取Excel数据实例

    2021-05-27 18:27:06
  • Android中复制图片的实例代码

    2023-01-07 21:34:26
  • java基础的详细了解第六天

    2021-11-05 16:18:49
  • Android Studio ADB网络调试汇总

    2023-07-13 22:10:07
  • 详解SpringBoot修改启动端口server.port的四种方式

    2022-03-10 20:28:48
  • JDBC自定义连接池过程详解

    2023-11-17 13:27:55
  • mybatis如何实现saveOrUpdate

    2021-07-18 10:33:11
  • Android开发中Activity的生命周期及加载模式详解

    2021-07-28 02:33:44
  • 对C# 多态的理解

    2022-10-17 02:37:26
  • Android仿淘宝商品详情页

    2023-09-08 18:37:26
  • Java基础之重载(Overload)与重写(Override)详解

    2023-07-31 08:10:25
  • C#自定义特性(Attribute)详解

    2023-12-13 12:51:08
  • asp之家 软件编程 m.aspxhome.com