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和優化

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,820評論 25 708
  • 文|張西影 含情脈脈的對視,不如朝同一個方向看去。沒有共同目標追求,只有淡淡遠離忘記。 玫瑰朝霞,輕紗薄霧 總往深...
    豫視西影閱讀 328評論 1 7
  • 印刷業的興起在技術性失業中有一定的影響,修道院制度的衰落也是技術性失業的某種表現。
    沈惜朝閱讀 244評論 0 0
  • 昨天看到好朋友發的一個貼子。 1.看孩子試卷要沉得住氣:切記孩子是你親生的,他不會,是因為遺傳了你! 2.考完試別...
    花間星事閱讀 721評論 6 21