Android基於HttpUrlConnection類的文件下載

来源:http://www.cnblogs.com/hejiaoshou/archive/2017/09/01/7463318.html
-Advertisement-
Play Games

有不清楚的地方歡迎各位朋友們留言 ...


 1   /**
 2      * get方法的文件下載
 3      * <p>
 4      * 特別說明 android中的progressBar是google唯一的做了處理的可以在子線程中更新UI的控制項
 5      *
 6      * @param path
 7      */
 8     private void httpDown(final String path) {
 9         new Thread() {
10             @Override
11             public void run() {
12                 URL url;
13                 HttpURLConnection connection;
14                 try {
15                     //統一資源
16                     url = new URL(path);
17                     //打開鏈接
18                     connection = (HttpURLConnection) url.openConnection();
19                     //設置鏈接超時
20                     connection.setConnectTimeout(4000);
21                     //設置允許得到伺服器的輸入流,預設為true可以不用設置
22                     connection.setDoInput(true);
23                     //設置允許向伺服器寫入數據,一般get方法不會設置,大多用在post方法,預設為false
24                     connection.setDoOutput(true);//此處只是為了方法說明
25                     //設置請求方法
26                     connection.setRequestMethod("GET");
27                     //設置請求的字元編碼
28                     connection.setRequestProperty("Charset", "utf-8");
29                     //設置connection打開鏈接資源
30                     connection.connect();
31 
32                     //得到鏈接地址中的file路徑
33                     String urlFilePath = connection.getURL().getFile();
34                     //得到url地址總文件名 file的separatorChar參數表示文件分離符
35                     String fileName = urlFilePath.substring(urlFilePath.lastIndexOf(File.separatorChar) + 1);
36                     //創建一個文件對象用於存儲下載的文件 此次的getFilesDir()方法只有在繼承至Context類的類中
37                     // 可以直接調用其他類中必須通過Context對象才能調用,得到的是內部存儲中此應用包名下的文件路徑
38                     //如果使用外部存儲的話需要添加文件讀寫許可權,5.0以上的系統需要動態獲取許可權 此處不在不做過多說明。
39                     File file = new File(getFilesDir(), fileName);
40                     //創建一個文件輸出流
41                     FileOutputStream outputStream = new FileOutputStream(file);
42 
43                     //得到鏈接的響應碼 200為成功
44                     int responseCode = connection.getResponseCode();
45                     if (responseCode == HttpURLConnection.HTTP_OK) {
46                         //得到伺服器響應的輸入流
47                         InputStream inputStream = connection.getInputStream();
48                         //獲取請求的內容總長度
49                         int contentLength = connection.getContentLength();
50 
51                         //設置progressBar的Max
52                         mPb.setMax(contentLength);
53 
54 
55                         //創建緩衝輸入流對象,相對於inputStream效率要高一些
56                         BufferedInputStream bfi = new BufferedInputStream(inputStream);
57                         //此處的len表示每次迴圈讀取的內容長度
58                         int len;
59                         //已經讀取的總長度
60                         int totle = 0;
61                         //bytes是用於存儲每次讀取出來的內容
62                         byte[] bytes = new byte[1024];
63                         while ((len = bfi.read(bytes)) != -1) {
64                             //每次讀取完了都將len累加在totle里
65                             totle += len;
66                             //每次讀取的都更新一次progressBar
67                             mPb.setProgress(totle);
68                             //通過文件輸出流寫入從伺服器中讀取的數據
69                             outputStream.write(bytes, 0, len);
70                         }
71                         //關閉打開的流對象
72                         outputStream.close();
73                         inputStream.close();
74                         bfi.close();
75 
76                         runOnUiThread(new Runnable() {
77                             @Override
78                             public void run() {
79                                 Toast.makeText(MainActivity.this, "下載完成!", Toast.LENGTH_SHORT).show();
80                             }
81                         });
82                     }
83 
84                 } catch (Exception e) {
85                     e.printStackTrace();
86                 }
87             }
88         }.start();
89     }

有不清楚的地方歡迎各位朋友們留言


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

-Advertisement-
Play Games
更多相關文章
  • 1.抽象的產品類 2.抽象的工廠類 3.客戶端的程式 至此,以上都是應用抽象工廠基本不變的代碼。接下來就是具體的實現類,也就是根據變化的需求給出變化的代碼 4.具體產品類 5.具體工廠類 6.應用 ...
  • 伺服器設置 1. 安裝64位JDK; 2. 設置Linux文件系統為Ext4 3.開啟2181,7771,7772防火牆埠 源碼編碼 1. 安裝Maven 2. 安裝OpenSesame 下載地址:https://github.com/alibaba/opensesame.git,將openses ...
  • 使用裝飾者模式,可以動態的給一個對象添加一些額外的職責。這適用於,我們只希望給某個對象而不是整個類添加一些功能的場景。通過使用含有某個特定功能的類來“包裹”原始的類,提供給原始的類某些它本身不具備的特性。比如,我們有一杯“茉莉茶”,現在加上一顆“檸檬”,那我們就有了一杯“檸檬茉莉花茶”。“檸檬”作為... ...
  • 驗幻空越重,命循頻異長。依輪線日簡,接偶正分壯。言歡空月蟲,明勛品宜昌。依倫先日賤,潔偶正粉妝。 ...
  • 線程池中緩存線程的集合就是個單例 ...
  • 之前一直聽一些大牛談論什麼架構、框架,給我的直觀感覺就是一樣的,但是看瞭如下博文,我恍然大悟,原來是兩碼事。 人們對軟體架構存在非常多的誤解,其中一個最為普遍的誤解就是:將架構(Architecture)和框架(Framework)混為一談。其實很簡單,一句話:框架是軟體,架構不是軟體。框架落腳在“ ...
  • 當您選擇將應用程式構建成為一組微服務時,您需要決定應用程式客戶端將如何與微服務進行交互。單體應用程式只有一組端點(endpoint),通常使用複製(replicated)結合負載均衡來分配流量。然而,在微服務架構中,每個微服務都暴露一組通常比較細顆粒的端點。在本文中,我們將研究如何改進客戶端通信,並... ...
  • 1、下載 Creating a Download Task 2、上傳 Creating an Upload Task 3、批量上傳 Creating an Upload Task for a Multi-Part Request, with Progress 4、數據任務 Creating a Da ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...