android的一個下載框架
http://www.jianshu.com/p/ba32dc499db3
https://github.com/AriaLyy/Aria
本文主要介紹開源專案Aria的使用。
Aria專案源於15年工作中遇到的一個檔案下載管理的需求,當時被下載折磨的痛不欲生,從那時起便萌生了編寫一個簡單易用,穩當高效的下載框架,aria經歷了1.0到3.0的開發,算是越來越接近當初所制定的目標了。
以下為Aria的使用示例,使用Aria開發圖片中的所有功能,只需要很短的時間,很少的程式碼。
Aria示例
編寫佈局檔案
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent">
<com.arialyy.simple.widget.HorizontalProgressBarWithNumber
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_alignParentLeft ="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_margin="16dp"
android:layout_toLeftOf="@+id/size"
android:max="100"
style="?android:attr/progressBarStyleHorizontal"/>
<TextView
android:id="@+id/size"
android:layout_width ="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/progressBar"
android:layout_marginRight="16dp"
android:text="0mb"
android:textSize="16sp"/>
<LinearLayout
android:id="@+id/handle_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/progressBar"
android:orientation="horizontal">
<TextView
android:id="@+id/speed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:text="0kb/s"
android:textColor="@android:color/black"/>
<Button
android:id="@+id/start"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:text="開始"
style="?buttonBarButtonStyle"/>
<Button
android:id="@+id/stop"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:text="暫停"
style="?buttonBarButtonStyle"/>
<Button
android:id="@+id/cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:text="刪除任務"
style="?buttonBarButtonStyle"/>
</LinearLayout>
</RelativeLayout>
呼叫Aria的api進行下載
@OnClick({ R.id.start, R.id.stop, R.id.cancel }) public void onClick(View view) {
switch (view.getId()) {
case R.id.start:
Aria.download(this)
.load(DOWNLOAD_URL)
.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk")
.start();
break;
case R.id.stop:
Aria.download(this).load(DOWNLOAD_URL).pause();
break;
case R.id.cancel:
Aria.download(this).load(DOWNLOAD_URL).cancel();
break;
}
}
在Aria的下載模組中,下載連結為下載任務的唯一識別符號,控制一個任務的開始、暫停、恢復、取消下載等操作都需要DOWNLOAD_URL支援。
另外,在Aira中,可以呼叫start()
方法開始下載或恢復下載。
為了方便起見,你也可以呼叫Aria.download(this).load(DOWNLOAD_URL).resume();
實現恢復下載。
Aria 提供了大量的API,除了以上幾個常用的API外,你還可以Aria Api;
下載事件的獲取
在上文中,我們已經實現在android中下載檔案的操作,是的,使用Aria,一行程式碼你就能實現複雜的斷點續傳功能。
除了正常的檔案需求外,有的時候,我們還需要獲取檔案的下載狀態用來更新介面的顯示。
在Aria
中,使用Aria
的事件監聽器,你能很容易的獲取到你想要的很多事件,如:
- 暫停、恢復、完成、失敗、取消下載等狀態
- 一句程式碼獲取當前任務的下載速度
- 一句程式碼獲取當前任務的進度的百分比
-
一句程式碼獲取當前任務的的檔案大小
...private class MySchedulerListener extends Aria.DownloadSchedulerListener { @Override public void onTaskStart(DownloadTask task) { mSize.setText(task.getConvertFileSize()); } @Override public void onTaskStop(DownloadTask task) { Toast.makeText(MainActivity.this, "停止下載", Toast.LENGTH_SHORT).show(); } @Override public void onTaskCancel(DownloadTask task) { Toast.makeText(MainActivity.this, "取消下載", Toast.LENGTH_SHORT).show(); } @Override public void onTaskFail(DownloadTask task) { Toast.makeText(MainActivity.this, "下載失敗", Toast.LENGTH_SHORT).show(); } @Override public void onTaskComplete(DownloadTask task) { Toast.makeText(MainActivity.this, "下載完成", Toast.LENGTH_SHORT).show(); } @Override public void onTaskRunning(DownloadTask task) { //使用轉換單位後的速度,需要在aria_config.xml配置檔案中將單位轉換開關開啟 //https://github.com/AriaLyy/Aria#配置檔案設定引數 mSpeed.setText(task.getConvertSpeed()); mPb.setProgress(task.getPercent()); } }
上文只列出了常見的下載事件,更多的下載狀態事件見Aria下載事件監聽器說明
在Aria中註冊新建立的事件監聽器
上文中,已經建立完了事件監聽器,這時,事件監聽器還沒能生效,你還需要將事件監聽器註冊到Aria中
@Override protected void onResume() {
super.onResume();
Aria.download(this).addSchedulerListener(new MySchedulerListener());
}
最終效果
最終效果
final
以上,便是使用Aria進行檔案下載的所有程式碼了,總的來說,Aria真的很簡單。
很少的程式碼,你就能實現複雜的檔案多執行緒斷點續傳功能,除此之外,Aria還支援多執行緒的配置,使用多少執行緒下載一個檔案,由你決定,具體見多執行緒配置。
Aria預設支援任務自動排程,從此,你再也不需要關心任務的暫停、恢復、完成、失敗、取消等狀態的排程。