多任務(wù)并行下載,斷點(diǎn)續(xù)傳,要做起來(lái)其實(shí)還是很麻煩的,所以推薦一個(gè)開(kāi)源庫(kù),這個(gè)開(kāi)源庫(kù)叫 Aria,剛好是我前一久搞斷點(diǎn)續(xù)傳時(shí)發(fā)現(xiàn)的,仔細(xì)了解后發(fā)現(xiàn),真香!?。?/p>
它簡(jiǎn)單易用,是個(gè)穩(wěn)當(dāng)高效的下載框架,不僅可以斷點(diǎn)續(xù)傳,還支持多任務(wù)自動(dòng)調(diào)度,更加靈活的事件監(jiān)聽(tīng)器,讓你能更容易的監(jiān)聽(tīng)暫停、恢復(fù)、完成、失敗、取消下載等狀態(tài)。
開(kāi)源庫(kù)地址是:https://github.com/AriaLyy/Aria
目前已經(jīng)有3.2k star,Aria有以下特點(diǎn):
- 簡(jiǎn)單、方便
- 可以在Activity、Service、Fragment、Dialog、popupWindow、Notification等組件中使用
- 支持HTTP\FTP斷點(diǎn)續(xù)傳下載、多任務(wù)自動(dòng)調(diào)度
- 支持多文件打包下載,多文件共享同一進(jìn)度(如:視頻 + 封面 + 字幕)
- 支持下載FTP文件夾
- 支持HTTP表單上傳
- 支持文件FTP斷點(diǎn)續(xù)傳上傳
- 支持FTPS斷點(diǎn)續(xù)傳
- 支持https地址下載
- 支持多線程分塊下載,能更有效的發(fā)揮機(jī)器IO性能
- 支持300、301、302重定向下載鏈接下載
- 支持m3u8協(xié)議的文件下載
- 支持m3u8邊下邊看的下載支持
- 下載支持文件長(zhǎng)度動(dòng)態(tài)增加,文件下載初始化時(shí)將不再占用過(guò)多的內(nèi)存空間
它的使用很簡(jiǎn)單,下面就簡(jiǎn)單介紹一下:
引入庫(kù)
implementation 'com.arialyy.aria:core:3.7.9'
annotationProcessor 'com.arialyy.aria:compiler:3.7.9'
# 如果需要使用ftp,請(qǐng)?jiān)黾釉摻M件
implementation 'com.arialyy.aria:ftpComponent:3.7.9'
# 如果需要使用m3u8下載功能,請(qǐng)?jiān)黾釉摻M件
implementation 'com.arialyy.aria:m3u8Component:3.7.9'
如果出現(xiàn)android support依賴錯(cuò)誤,請(qǐng)將
compile 'com.arialyy.aria:core:<last-version>'
替換為
api('com.arialyy.aria:core:<last-version>'){
exclude group: 'androidx.appcompat.app'
}
如果你使用的是kotlin,請(qǐng)使用kotlin官方提供的方法配置apt:https://www.kotlincn.net/docs/reference/kapt.html
注:3.7 以上版本已經(jīng)適配了AndroidX,如果是使用support庫(kù)的,可使用老版本
使用
由于Aria涉及到文件和網(wǎng)絡(luò)的操作,因此需要你在manifest文件中添加以下權(quán)限,如果你希望在6.0以上的系統(tǒng)中使用Aria,那么你需要?jiǎng)討B(tài)向安卓系統(tǒng)申請(qǐng)文件系統(tǒng)讀寫(xiě)權(quán)限。
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
例子為單任務(wù)下載,只需要很簡(jiǎn)單的代碼,便可以實(shí)現(xiàn)下載功能。
- 創(chuàng)建任務(wù)
long taskId = Aria.download(this) .load(DOWNLOAD_URL) //讀取下載地址 .setFilePath(DOWNLOAD_PATH) //設(shè)置文件保存的完整路徑 .create(); //創(chuàng)建并啟動(dòng)下載 - 停止\恢復(fù)任務(wù)
Aria.download(this) .load(taskId) //讀取任務(wù)id .stop(); // 停止任務(wù) //.resume(); // 恢復(fù)任務(wù)
任務(wù)狀態(tài)的獲取
基于解耦合的考慮,Aria的下載功能是和狀態(tài)獲取相分離的,狀態(tài)的獲取并不會(huì)集成到鏈?zhǔn)酱a中,但是Aria提供了另一種更簡(jiǎn)單更靈活的方案。
通過(guò)注解,你可以很容易獲取任務(wù)的所有狀態(tài)。
- 將對(duì)象注冊(cè)到Aria
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Aria.download(this).register();
}
- 通過(guò)注解獲取任務(wù)執(zhí)行狀態(tài)
- 注解回掉采用Apt的方式實(shí)現(xiàn),所以,你不需要擔(dān)心這會(huì)影響你機(jī)器的性能
- 被注解的方法不能被private修飾
- 被注解的方法只能有一個(gè)參數(shù),并且參數(shù)類型必須是
DownloadTask或UploadTask或DownloadGroupTask - 方法名可以為任意字符串
//在這里處理任務(wù)執(zhí)行中的狀態(tài),如進(jìn)度進(jìn)度條的刷新
@Download.onTaskRunning protected void running(DownloadTask task) {
if(task.getKey().eques(url)){
....
可以通過(guò)url判斷是否是指定任務(wù)的回調(diào)
}
int p = task.getPercent(); //任務(wù)進(jìn)度百分比
String speed = task.getConvertSpeed(); //轉(zhuǎn)換單位后的下載速度,單位轉(zhuǎn)換需要在配置文件中打開(kāi)
String speed1 = task.getSpeed(); //原始byte長(zhǎng)度速度
}
@Download.onTaskComplete void taskComplete(DownloadTask task) {
//在這里處理任務(wù)完成的狀態(tài)
}
混淆配置
-dontwarn com.arialyy.aria.**
-keep class com.arialyy.aria.**{*;}
-keep class **$$DownloadListenerProxy{ *; }
-keep class **$$UploadListenerProxy{ *; }
-keep class **$$DownloadGroupListenerProxy{ *; }
-keepclasseswithmembernames class * {
@Download.* <methods>;
@Upload.* <methods>;
@DownloadGroup.* <methods>;
}
更多的使用方式可參考文檔:https://aria.laoyuyu.me/aria_doc/