NoHttp封裝--05 文件下載

来源:https://www.cnblogs.com/ganchuanpu/archive/2018/05/13/9032827.html
-Advertisement-
Play Games

xml java: ...


xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <ProgressBar
        android:id="@+id/pb_progress"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp" />

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_start_download"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="下載" />

</LinearLayout>

java:

  1 import com.yolanda.nohttp.Headers;
  2 import com.yolanda.nohttp.NoHttp;
  3 import com.yolanda.nohttp.download.DownloadListener;
  4 import com.yolanda.nohttp.download.DownloadRequest;
  5 import com.yolanda.nohttp.error.ArgumentError;
  6 import com.yolanda.nohttp.error.ClientError;
  7 import com.yolanda.nohttp.error.NetworkError;
  8 import com.yolanda.nohttp.error.ServerError;
  9 import com.yolanda.nohttp.error.StorageReadWriteError;
 10 import com.yolanda.nohttp.error.StorageSpaceNotEnoughError;
 11 import com.yolanda.nohttp.error.TimeoutError;
 12 import com.yolanda.nohttp.error.URLError;
 13 import com.yolanda.nohttp.error.UnKnownHostError;
 14 import com.yolanda.nohttp5.R;
 15 import com.yolanda.nohttp5.config.AppConfig;
 16 import com.yolanda.nohttp5.nohttp.CallServer;
 17 import com.yolanda.nohttp5.util.Toast;
 18 
 19 import android.app.Activity;
 20 import android.os.Bundle;
 21 import android.os.Environment;
 22 import android.view.View;
 23 import android.widget.ProgressBar;
 24 import android.widget.TextView;
 25 
 26 public class DownloadActivity extends Activity implements View.OnClickListener, DownloadListener {
 27 
 28     private final static String PROGRESS_KEY = "download_progress";
 29     /**
 30      * 下載按鈕、暫停、開始等.
 31      */
 32     private TextView mBtnStart;
 33     /**
 34      * 下載狀態.
 35      */
 36     private TextView mTvResult;
 37     /**
 38      * 下載進度條.
 39      */
 40     private ProgressBar mProgressBar;
 41     /***
 42      * 下載地址.
 43      */
 44     private String url = "http://m.apk.67mo.com/apk/999129_21769077_1443483983292.apk";
 45     /**
 46      * 下載請求.
 47      */
 48     private DownloadRequest downloadRequest;
 49 
 50     @Override
 51     protected void onCreate(Bundle savedInstanceState) {
 52         super.onCreate(savedInstanceState);
 53         setContentView(R.layout.activity_download);
 54 
 55         mProgressBar = (ProgressBar) findViewById(R.id.pb_progress);
 56         mBtnStart = (TextView) findViewById(R.id.btn_start_download);
 57         mTvResult = (TextView) findViewById(R.id.tv_result);
 58         mBtnStart.setOnClickListener(this);
 59 
 60         // url 下載地址
 61         // fileFolder 保存的文件夾
 62         // fileName 文件名
 63         // isRange 是否斷點續傳下載
 64         // isDeleteOld 如果發現文件已經存在是否刪除後重新下載
 65         String path = Environment.getExternalStorageDirectory().getAbsolutePath();
 66         downloadRequest = NoHttp.createDownloadRequest(url, path, "nohttp.apk", true, false);
 67 
 68         // 檢查已經下載了一半的文件是什麼狀態
 69         int status = downloadRequest.checkBeforeStatus();
 70         if (status == DownloadRequest.STATUS_FINISH) {// 文件已經下載完成
 71             mTvResult.setText("下載完成");
 72             mBtnStart.setText("已經下載完成");
 73             // ... 提示用戶安裝apk
 74         } else if (status == DownloadRequest.STATUS_RESTART) {// 代表文件不存在,需要從頭下載
 75             mTvResult.setText("");
 76             mBtnStart.setText("下載");
 77         } else if (status == DownloadRequest.STATUS_RESUME) {// 代表文件已經下載了一半了
 78             int progress = AppConfig.getInstance().getInt(PROGRESS_KEY, 0);
 79             mProgressBar.setProgress(progress);
 80             mTvResult.setText("已經下載了 " + progress + "%");
 81             mBtnStart.setText("繼續下載");
 82         }
 83     }
 84 
 85     @Override
 86     public void onClick(View v) {
 87         if (downloadRequest.isStarted()) {
 88             // 暫停下載
 89             downloadRequest.cancel(true);
 90         } else {
 91             // what 區分下載
 92             // downloadRequest 下載請求對象
 93             // downloadListener 下載監聽
 94             CallServer.getDownloadInstance().add(0, downloadRequest, this);
 95         }
 96     }
 97 
 98     /**
 99      * @param what 代表哪一個下載
100      * @param isResume 是不是斷點續續傳開始下載的
101      * @param beforeLenght 斷點開始的地方的文件大小
102      * @param headers 本地請求的時候的響應頭
103      * @param allCount 本次需要下載多少
104      */
105     @Override
106     public void onStart(int what, boolean isResume, long beforeLenght, Headers headers, long allCount) {
107         int progress = AppConfig.getInstance().getInt(PROGRESS_KEY, 0);
108         mTvResult.setText("已下載: " + progress + "%");
109         mBtnStart.setText("暫停");
110     }
111 
112     @Override
113     public void onProgress(int what, int progress, long fileCount) {
114         AppConfig.getInstance().putInt(PROGRESS_KEY, progress);
115         mProgressBar.setProgress(progress);
116         mTvResult.setText("已經下載了 " + progress + "%");
117     }
118 
119     @Override
120     public void onDownloadError(int what, Exception exception) {
121         mBtnStart.setText("再次嘗試");
122 
123         String message = "下載出錯了:";
124         if (exception instanceof ClientError) {
125             message += "客戶端錯誤";
126         } else if (exception instanceof ServerError) {
127             message += "伺服器發生內部錯誤";
128         } else if (exception instanceof NetworkError) {
129             message += "網路不可用,請檢查網路";
130         } else if (exception instanceof StorageReadWriteError) {
131             message += "存儲卡錯誤,請檢查存儲卡";
132         } else if (exception instanceof StorageSpaceNotEnoughError) {
133             message += "存儲位置空間不足";
134         } else if (exception instanceof TimeoutError) {
135             message += "下載超時";
136         } else if (exception instanceof UnKnownHostError) {
137             message += "伺服器找不到";
138         } else if (exception instanceof URLError) {
139             message += "url地址錯誤";
140         } else if (exception instanceof ArgumentError) {
141             message += "下載參數錯誤";
142         } else {
143             message += "未知錯誤";
144         }
145         mTvResult.setText(message);
146     }
147 
148     @Override
149     public void onFinish(int what, String filePath) {
150         Toast.show("下載完成");
151         mTvResult.setText("下載完成,文件保存在:" + filePath);
152     }
153 
154     @Override
155     public void onCancel(int what) {
156         mTvResult.setText("下載暫停");
157         mBtnStart.setText("繼續下載");
158     }
159 
160 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題: 偶然使用 windows 進行編寫腳本。使用 wsl (windows subsystem for linux) 進行運行的時候,什麼事情沒有。但是當把腳本移植到遠程伺服器進行運行的時候,發現腳本執行出現了錯誤:-bash: ./switch.sh: /bin/bash^M: bad int ...
  • i.MXRT支持存儲類型一共有三種:一是96KB的ROM(即BootROM)、二是總容量3*256KB的RAM(OCRAM/DTCM/ITCM)、三是分配給外部存儲器介面控制器(SEMC/QSPI)的2GB區域。i.MXRT Boot方式主要是藉助BootROM從外部存儲器載入Application... ...
  • 一、工具準備: 1.內網虛擬機Ubuntu12.04系統主機一臺,開放埠為:29999 2.遠程連接軟體:mobaxterm 二、開啟步驟: 1.查看埠狀態信息: netstat -antl | grep 29999 發現29999埠處於監聽狀態 3.配置sshd_config將預設埠22設 ...
  • 註冊碼product code(產品編碼): 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le serial Number(序列號):226959 password(口令): xs374ca ...
  • 主要從以上篇幅來介紹mysql的一些知識點 一.Mysql簡介 MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Da ...
  • Hive的數據導入: 1.從本地文件系統中導入數據到Hive表 基礎語法1 : create table 表名(列名1 數據類型, 列名2 數據類型, … …) row format delimited fields terminated by '分隔符' stored as textfile 參數 ...
  • HDFS 與 Hbase HDFS容錯率很高,即便是在系統崩潰的情況下,也能夠在節點之間快速傳輸數據。HBase是非關係資料庫,是開源的Not-Only-SQL資料庫,它的運行建立在Hadoop上。HBase依賴於CAP定理(Consistency, Availability, and Partit... ...
  • 公司產品需要一個雷達圖來展示各維度的比重,網上找了一波,學到不少,直接自己上手來擼一記 無圖言虛空 簡單分析一波,確定雷達圖正幾邊形的 正五邊形 int count=5,分為幾個層數 4 層 int layerCount=4 主要這幾步,開擼! 自定義RadarView繼承View 確定需要使用的變 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...