最近封裝了一個基于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和優化