欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于DownloadManager的簡單下載器編寫小結

 更新時間:2017年12月17日 09:05:53   作者:YWQalways樂觀自信愛  
Android自帶的DownloadManager是一個很好的下載文件的工具。該類在API level 9之后出現(xiàn),它已經(jīng)幫我們處理了下載失敗、重新下載等功能,整個下載過程全部交給系統(tǒng)負責,不需要我們過多的處理,非常的nice。關鍵的是用起來也很簡單,稍微封裝一下就可以幾句話搞定下載

一直聽說過Android自帶的DownloadManager,只是拖延癥發(fā)作,一直沒有時間去研究研究,其實在很多項目開發(fā)中,都有一個功能是非常重要的,那就是應用的檢查更新了!基于DownloadManager,可以做一個輕量級的下載器,將下載任務交給系統(tǒng)去執(zhí)行,減輕自身APP的壓力,何樂而不為呢?!

DownloadManager的基本使用姿勢

通過getSystemService進行實例化

DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
構建下載請求

DownloadManager.Request request = new DownloadManager.Request(Uri.parse("目標文件下載地址"));
//設置目標文件夾,如果你想在系統(tǒng)的storage目錄下載一個testDownload/test/test.apk
request.setDestinationInExternalPublicDir("testDownload", "test/test.apk");
//設置下載所需的網(wǎng)絡環(huán)境,設置了移動網(wǎng)絡和WiFi環(huán)境下均能下載 request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
//通知欄設置
//顯示在通知欄
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);

注意?。?!如果選擇不顯示在通知欄,那么必須聲明以下權限

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />

然后設置不可見

request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);

否則將會拋出一個securityException

//設置文件類型為apk類型,當downloadManager調用openFile時會喚起相應的程序
request.setMimeType("application/cn.trinea.download.file");
 //開始下載,得到一個唯一的downloadId,大有用處
long downloadId = downloadManager.enqueue(request);

如何獲取下載的情況呢

private int[] getBytesAndStatus(long downloadId) {

    //構建一個數(shù)組,存放已下載文件大小、總大小、下載狀態(tài)
    int[] bytesAndStatus = new int[]{
        -1, -1, 0
    };
    //通過構建下載請求時獲得的downloadId進行文件查詢
    DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
    Cursor cursor = null;
    try {
      cursor = downloadManager.query(query);
      if (cursor != null && cursor.moveToFirst()) {
        //已經(jīng)下載文件大小
        bytesAndStatus[0] = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
        //下載文件的總大小
        bytesAndStatus[1] = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
        //下載狀態(tài)
        bytesAndStatus[2] = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
      }
    } finally {
      if (cursor != null) {
        cursor.close();
      }
    }
    return bytesAndStatus;
  }

注冊監(jiān)聽文件下載成功的廣播

private BroadcastReceiver downloadCompleteReceiver;
downloadCompleteReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
        //文件下載成功時
         DownloadManager.Query query = new DownloadManager.Query();
        //通過下載的id查找
        query.setFilterById(downloadId);
        Cursor c = downloadManager.query(query);
        if (c.moveToFirst()) {
            int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
            switch (status) {
              //下載完成
              case DownloadManager.STATUS_SUCCESSFUL:

                 break;

               }

         }
      }
    };
//注冊,這里只能攔截文件下載成功的廣播,并不能進行進度監(jiān)聽,在適當?shù)牡胤饺∠嗛啅V播
context.registerReceiver(downloadCompleteReceiver,
        new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

網(wǎng)上很多博客都是通過自定義ContentObserver獲取本地文件變化,其實可以另辟蹊徑,通過一個定時器間隔調用以上getBytesAndStatus(long downloadId)能達到同樣的效果,用Rxjava實現(xiàn)一個簡單的定時器

/**
 * 由于DownloadManager自身沒有提供實時進度的api,所以通過以下定時器獲取已下載的文件大小
 */
  private void updateProgress() {
        //每隔0.5秒刷新一次進度,在適當?shù)牡胤接浀米N timeDisposable
        Disposable timeDisposable = Observable.interval(500, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread()).subscribe(new DataConsumer<Long>() {
          @Override
          public void acceptData(@io.reactivex.annotations.NonNull Long aLong) {

            int [ ] bytesAndStatus = getBytesAndStatus(downloadId);
            //todo 在這里進行回調即可
          }
        });

  }

了解完DownloadManager基本的使用方式,那么基于它來封裝一個簡單易用的下載器吧!

實現(xiàn)效果

 DownloadHelper.Builder builder = new DownloadHelper.Builder(this).title("下載通知")
          .description("正在下載新版本V1.2.0")
          .downloadUrl("http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk")
          .fileSaveName("MobileAssistant_1.apk").fileSavePath("testDownload")
          .notifyVisible(true)
          .fileType(DownloadHelper.FileType.APK).apkInstallHint(true).onProgressListener(new DownloadHelper.OnDownloadProgressListener() {
            @Override
            public void onProgress(int downloadedSize, int totalSize) {

              int progress =(int)((downloadedSize*1.0f/totalSize)*100);
              Logger.d("progress=%d",progress);
               //進度回調

            }

            @Override
            public void onSuccess(Uri fileUri) {
             //文件下載成功回調的Uri
 

            }

            @Override
            public void onFail() {
             //文件下載失敗
  

            }

            @Override
            public void fileAlreadyExits(File file) { 
            //當你想重復下載同樣的文件時,本地檢測是否存在同樣的文件,進行回調
             
            }
          });
      DownloadHelper downloadHelper = builder.build();
      //開始下載
      downloadHelper.start();
      //移除下載任務
      downloadHelper.deleteDownloadFile();

源碼請到https://github.com/yuwenque/SimpleDownloadHelper.git

相關文章

  • 實例詳解android studio如何導入.so文件的方法

    實例詳解android studio如何導入.so文件的方法

    通過實例給大家詳細講解了如何在android studio如何導入.so文件以及中間遇到的問題解決辦法,需要的讀者們可以仔細學習一下。
    2017-12-12
  • Android Studio實現(xiàn)簡單計算器APP

    Android Studio實現(xiàn)簡單計算器APP

    這篇文章主要為大家詳細介紹了Android Studio實現(xiàn)簡單計算器APP,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • android自定義彈出框樣式的實現(xiàn)方法

    android自定義彈出框樣式的實現(xiàn)方法

    這篇文章主要為大家詳細介紹了android自定義彈出框樣式的實現(xiàn)方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Android Studio實現(xiàn)標題欄和狀態(tài)欄的隱藏

    Android Studio實現(xiàn)標題欄和狀態(tài)欄的隱藏

    這篇文章主要介紹了Android Studio實現(xiàn)標題欄和狀態(tài)欄的隱藏功能,在文中給大家補充介紹了android studio 去掉標題欄狀態(tài)欄的完整代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-11-11
  • Android開發(fā)多手指觸控事件處理

    Android開發(fā)多手指觸控事件處理

    這篇文章主要為大家介紹了Android開發(fā)多手指觸控事件處理教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 使用Chrome瀏覽器調試Android App詳解

    使用Chrome瀏覽器調試Android App詳解

    這篇文章主要介紹了使用Chrome瀏覽器調試Android App詳解,本網(wǎng)講解了使用Facebook開源Stetho實現(xiàn)在Chrome中調試Android App中,需要的朋友可以參考下
    2015-05-05
  • Android官方的側滑控件DrawerLayout的示例代碼

    Android官方的側滑控件DrawerLayout的示例代碼

    這篇文章主要介紹了Android官方的側滑控件DrawerLayout的示例代碼,非常具有實用價值,需要的朋友可以參考下
    2017-09-09
  • Android UI控件之ImageSwitcher實現(xiàn)圖片切換效果

    Android UI控件之ImageSwitcher實現(xiàn)圖片切換效果

    這篇文章主要為大家詳細介紹了Android UI控件之ImageSwitcher實現(xiàn)圖片切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android繪制音樂播放器示波器

    Android繪制音樂播放器示波器

    這篇文章主要為大家詳細介紹了Android繪制音樂播放器示波器的相關資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android重力傳感器實現(xiàn)滾動的彈球

    Android重力傳感器實現(xiàn)滾動的彈球

    所謂傳感器能夠探測如光、熱、溫度、重力、方向 等等的功能,本文給大家介紹Android傳感器應用之重力傳感器實現(xiàn)滾動的彈球,對android重力傳感器相關知識感興趣的朋友一起看看吧
    2015-12-12

最新評論