Android下载库(OkHttp3+Retrofit2+RxJava2)

最近封装了一个基于OkHttp3+Retrofit2+RxJava2的下载库给自己的项目用。

  • 断点续传
  • 多任务
  • 数据库存储

先上图(有点糊,各位看官将就一下,有没有人给推荐一个靠谱点的录屏工具【摔盐】不用Windows,谢谢)

preview.gif

嗯。大概就是这鸟样子。有要吐槽UI的,请你安静点,请你安静点,耶~
可能因为服务器和模拟器是同一台电脑,所以速度比较快。。。
下面是重点

//核心库
implementation 'eason.linyuzai:eason-download:1.0.1'
//如有需要可以添加额外的监听器
implementation 'eason.linyuzai:eason-download-listeners:1.0.1'

然后是最简单的用法

//可以当成Http Client
ELoad eload = ELoad.Builder(Context context).build();
//可以当成一个Request
DownloadTask task = eload.url(String url).create();
task.start();

然后来讲一下自定义配置
ELoad配置

//ELoad配置,配置对所有该ELoad生成的Task生效
ELoad eload = ELoad.Builder(Context context)
//任务回收器,默认使用TaskQueueRecycler
.setTaskRecycler(TaskRecycler taskRecycler)
//文件写入器,默认使用OkioSourceFileProcessor
.setFileProcessor(FileProcessor fileProcessor)
//下载路径,默认context.getExternalCacheDir()+"/ELoad"
.setDownloadPath(String downloadPath)
//生成OkHttpClient.Builder,默认使用DefaultOkHttpClientFactory
.setOkHttpClientFactory(OkHttpClientFactory okHttpClientFactory)
//生成Retrofit.Builder,默认使用DefaultRetrofitFactory
.setRetrofitFactory(RetrofitFactory retrofitFactory)
//数据库,默认null,不写入数据库
//提供SQLiteManager,也可自己定义,使用其他ORM库
.setDatabaseManager(DatabaseManager databaseManager)
//生成数据库Bean,如有需要,用于扩展注解式ORM框架
.setEntityCreator(DownloadTaskEntity.Creator entityCreator)
//下载进度监听
.addDownloadListeners(DownloadTask.DownloadListener listener)
//下载任务状态监听
.addDownloadTaskListener(DownloadTask.DownloadTaskListener listener)
.build();

DownloadTask配置

//方式1:
DownloadTask task = eload.url(String url)//url配置
//添加header
.header(String headerName, String headerValue)
//设置headers
.headers(Map<String, String> headers)
//下载路径,对单个任务有效
.filepath(String filepath)
//文件名称,不设置会尝试根据Response等信息获取或随机生成
.filename(String filename)
//URLDecoder,配合服务端进行中文的编解码等
.urlDecoder(String urlDecoder)
//自定义数据
.extra(Serializable extra)
//下载进度监听,对单个任务有效
.downloadListener(DownloadTask.DownloadListener listener)
//下载任务状态监听,对单个任务有效
.downloadTaskListener(DownloadTask.DownloadTaskListener listener)
.create();

//方式2:
//通过数据库
List<DownloadTaskEntity> entities = eload.loadTaskEntitiesFromDatabase()
//将保存的任务记录重新生成DownloadTask
DownloadTask task = eload.convert(DownloadTaskEntity entity)
//下载进度监听,对单个任务有效
.downloadListener(DownloadTask.DownloadListener listener)
//下载任务状态监听,对单个任务有效
.downloadTaskListener(DownloadTask.DownloadTaskListener listener)
.create();

操作DownloadTask

//开始
DownloadTask.start();
//强制开始,在暂停,取消,异常的状态时可以重新下载
DownloadTask.start(true);
//暂停
DownloadTask.pause();
//继续,在暂停或异常的状态时可以继续下载
DownloadTask.resume();
//取消
DownloadTask.cancel();
//取消,并删除已下载的部分文件
DownloadTask.cancel(true);
//回收,可以在任务未开始,完成,异常,取消的状态时回收,复用OkHttpClient
DownloadTask.recycle();

DownloadTask属性

//获得DownloadTaskEntity
DownloadTaskEntity getEntity();
//running状态时,下载总进度
long getDownloadBytesTemp();
//是否是空闲状态
boolean isIdle();
//是否是准备状态
boolean isAttach();
//是否是下载状态
boolean isRunning();
//是否是暂停状态
boolean isPause();
//是否完成
boolean isFinish();
//是否异常
boolean isError();
//是否取消
boolean isCancel();

DownloadTaskEntity属性

//TaskId
String getTaskId();
//创建时间
long getCreateTime();
//执行状态
int getState();
//http(s) Headers
Map<String, String> getHeaders();
//Url
String getUrl();
//URLDecoder
String getUrlDecoder();
//文件总大小
long getTotalBytes();
//已下载大小,只有暂停,取消,异常时才会更新
//更新进度请用DownloadTask.getDownloadBytesTemp()
long getDownloadBytes();
//文件路径
String getFilePath();
//文件名字
String getFileName();
//额外数据
Serializable getExtra();

使用RxJava2代替DownloadListener和DownloadTaskListener的监听

//回调下载进度和任务状态
DownloadTask.toObservable();
//回调下载进度
DownloadTask.toDownloadObservable();
//回调任务状态
DownloadTask.toTaskObservable();

DownloadTask.toObservable().subscribe({
    switch(it.callType) {
    case DownloadTaskWrapper.DOWNLOAD_CONTENT_LENGTH:
        //文件大小
        break;
    case DownloadTaskWrapper.DOWNLOAD_BYTES_READ:
        //字节读入
        break;
    case DownloadTaskWrapper.DOWNLOAD_COMPLETE:
        //下载完成
        break;
    case DownloadTaskWrapper.TASK_PREPARE:
        //任务准备
        break;
    case DownloadTaskWrapper.TASK_START:
        //任务开始
        break;
    case DownloadTaskWrapper.TASK_PAUSE:
        //任务暂停
        break;
    case DownloadTaskWrapper.TASK_RESUME:
        //任务继续
        break;
    case DownloadTaskWrapper.TASK_ERROR:
        //任务异常
        break;
    case DownloadTaskWrapper.TASK_COMPLETE:
        //任务完成
        break;
    case DownloadTaskWrapper.TASK_CANCEL:
        //任务取消
        break;
    case DownloadTaskWrapper.TASK_RESET:
        //任务重置
        break;
    case DownloadTaskWrapper.TASK_RECYCLE:
        //任务回收
        break;
    }
});
//开始任务
DownloadTask.start();

也提供Flowable的转换
额外的监听器

//网速计算
NetPerSecDownloadListener(TextView textView)
//剩余时间
RemainingTimeDownloadListener(TextView textView)
//百分比下载进度
PercentProgressDownloadListener(TextView textView, ProgressBar progressBar, long interval)
//具体数据下载进度
NumberProgressDownloadListener(TextView textView, ProgressBar progressBar, long interval)
//上述监听器都可以设置回调间隔时间
//主线程回调下载进度监听
MainThreadDownloadListener()
//主线程回调下载任务状态监听
MainThreadDownloadTaskListener()

欢迎各位提出bug和优化

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,506评论 25 707
  • 文|张西影 含情脉脉的对视,不如朝同一个方向看去。没有共同目标追求,只有淡淡远离忘记。 玫瑰朝霞,轻纱薄雾 总往深...
    豫视西影阅读 316评论 1 7
  • 印刷业的兴起在技术性失业中有一定的影响,修道院制度的衰落也是技术性失业的某种表现。
    沈惜朝阅读 229评论 0 0
  • 昨天看到好朋友发的一个贴子。 1.看孩子试卷要沉得住气:切记孩子是你亲生的,他不会,是因为遗传了你! 2.考完试别...
    花间星事阅读 701评论 6 21