1. 程式人生 > >一行程式碼實現android檔案下載

一行程式碼實現android檔案下載

起源

本文主要介紹開源專案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預設支援任務自動排程,從此,你再也不需要關心任務的暫停、恢復、完成、失敗、取消等狀態的排程。