Android 根據Url使用Retrofit框架進行文件下載

一、背景

根據后端返回的url下載地址,去執行文件下載,將文件保存到SD卡。這里使用Retrofit網絡框架。

二、代碼實現

2.1、定義一個DownloadFileService
interface DownloadFileService {@Streaming@GETsuspend fun downloadFile(@Url fileUrl: String):ResponseBody
}
2.2、定義一個FileDownloadClient
private var mDownliadService: DownloadFileService? = nullfun getUploadFileService() :DownloadFileService{if(mDownliadService==null){val okHttpClient = OkHttpClient.Builder().callTimeout(0, TimeUnit.SECONDS)//0 代表不考慮請求的超時 這里的超時是指整個請求過程的超時,如果設置太短,任務還沒執行完,會以超時結束任務,這里尤其要注意.connectTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).retryOnConnectionFailure(false)// 重連.followRedirects(false)// 重定向//.addInterceptor(RequestInterceptor(authorization,requestId,offset,uploadType))//.addInterceptor(RemoveContentLengthInterceptor())//.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)).build()val retrofit: Retrofit = Retrofit.Builder().baseUrl(DeviceUtil.getInstance().getServerIp()).addConverterFactory(GsonConverterFactory.create()).client(okHttpClient).build()mDownliadService= retrofit.create(DownloadFileService::class.java)}return mDownliadService!!}
2.3、定義一個DownloadCallback
interface DownloadCallback {fun onSuccess(srcApkTarPath:String)fun onProgress(progress: Int)fun onFailure(msg:String?)
}
2.4、定義一個FileDownloadManager,執行文件下載
class FileDownloadManager {private val TAG = "FileDownloadManager_"companion object {private var singleInstance: FileDownloadManager? = nullget() {// 懶漢模式if (null == field) {field = FileDownloadManager()}return field}@Synchronized // 添加注解,線程同步,線程安全fun getInstance(): FileDownloadManager {return singleInstance!! // 表示非空時執行}}fun doDownloadFile(appName:String,packageName: String,downUrl: String,fileSize: Long,fileMd5:String,downloadCallback: DownloadCallback) {try {val coroutineScope = CoroutineScope(Dispatchers.Default)coroutineScope.launch(Dispatchers.IO) {val response = FileDownloadClient.getUploadFileService().downloadFile(downUrl)val length = response.contentLength()XLogUtil.d("${TAG}doDownloadFile result appName:$appName,,,packageName:$packageName,,,length:$length,,,fileSize:$fileSize,,,downUrl:$downUrl")if (length > 0) {val folder = File(ConstantUtil.DOWNLOAD_FOLDER_PATH)if (!folder.exists()) {folder.mkdirs()}// 使用輸入流保存響應體到文件val inputStream = response.byteStream()val fileName = "$packageName.tar"var fileTargetPath =ConstantUtil.DOWNLOAD_FOLDER_PATH + File.separator + fileNameval outputStream = FileOutputStream(fileTargetPath)val buf = ByteArray(1024)var downLoadFileSize = 0var lastProgress = 0do {val numread = inputStream.read(buf)if (numread == -1) {break}outputStream.write(buf, 0, numread)downLoadFileSize += numreadval progressValue =((downLoadFileSize * 100f) / length).toInt()//相同的進度值只回調一次if (progressValue > lastProgress) {lastProgress = progressValuedownloadCallback?.apply {onProgress(progressValue)}}} while (true)outputStream.flush()// 關閉文件輸出流和輸入流outputStream.close()//inputStream.close()val localFileMd5=FileUtil.getInstance().getFileMd5(fileTargetPath)if(localFileMd5==fileMd5){downloadCallback?.onSuccess(fileTargetPath)}else{downloadCallback?.onFailure("文件 md5 不一致,localFileMd5:$localFileMd5,,,fileMd5:$fileMd5")}}else{downloadCallback?.onFailure("讀取文件len=0")}}} catch (e: Exception) {XLogUtil.e("${TAG}doDownloadFile Exception appName:$appName,,,packageName:$packageName,,,Exception:${e.message},,,fileSize:$fileSize,,,downUrl:$downUrl")downloadCallback?.onFailure(e.message)}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73032.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NVMe(Non-Volatile Memory Express)詳解

一、NVMe的定義與核心特性 NVMe(非易失性內存主機控制器接口規范)是一種 基于PCIe總線的高性能存儲協議,專為固態硬盤(SSD)設計,旨在替代傳統的AHCI協議(如SATA)。其核心特性包括&a…

機器學習——KNN超參數

sklearn.model_selection.GridSearchCV 是 scikit-learn 中用于超參數調優的核心工具,通過結合交叉驗證和網格搜索實現模型參數的自動化優化。以下是詳細介紹: 一、功能概述 GridSearchCV 在指定參數網格上窮舉所有可能的超參數組合,通過交叉…

穩定運行的以Oracle NoSQL數據庫為數據源和目標的ETL性能變差時提高性能方法和步驟

提高基于Oracle NoSQL數據庫的ETL(提取、轉換、加載)性能時,主要從多個角度進行優化。 提高基于Oracle NoSQL數據庫的ETL性能需要綜合考慮多個方面,關鍵是減少不必要的I/O操作、優化數據轉換和加載過程、合理配置Oracle NoSQL數據…

Compose 原理解析

Compose 的組件都是放在 setContent() 之后才能顯示的,那需要先看看這個函數的作用。 先看 ComponentActivity 的擴展函數 setContent(): /*** 將給定的可組合項合成到給定的 Activity 中。[content] 將成為給定 Activity 的根視圖。* 這大致相當于使用…

細說衛星導航:測距定位原理

測距定位原理 1. 偽距測量技術 核心原理:衛星發射信號,用戶接收并記錄傳播時間,乘以光速得到距離(偽距)。 技術細節: 信號傳播路徑分析 信號結構: 衛星信號包含三部分: 載波&…

19921 多重背包

19921 多重背包 ??難度:中等 🌟考點:動態規劃、背包問題 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N …

js逆向之斷點調試

1.XHR/提取斷點用法 當刷新頁面時候,有大量請求,并且你無法定位參數信息的時候,或者參數被混淆無法搜到,可以用該方法,該方法是會捕獲所有請求連接,然后我們通過連接過濾出自己想要的請求,然后…

基于32單片機的無人機直流電機閉環調速系統設計

標題:基于32單片機的無人機直流電機閉環調速系統設計 內容:1.摘要 本文針對無人機直流電機調速需求,設計了基于32單片機的無人機直流電機閉環調速系統。背景在于無人機應用場景不斷拓展,對電機調速精度和穩定性要求日益提高。目的是開發一套高精度、響應…

如何用Deepseek制作流程圖?

使用Deepseek制作流程圖,本質上是讓AI根據你的需求,生成相關流程圖的代碼,然后在流程圖編輯器中渲染,類似于Python一樣,ChatGPT可以生成代碼,但仍需在IDE中執行。 你知道繪制流程圖最高效的工具是什么嗎&a…

嵌入式硬件工程師從小白到入門-原理圖(三)

原理圖繪制從小白到入門:知識點速通與注意事項 一、原理圖繪制基礎概念 什么是原理圖? 原理圖(Schematic)是電子電路的圖形化表示,展示元器件之間的電氣連接關系,是硬件設計的藍圖。 核心元素 元器件符號&…

WSL 環境橋接與雷達通信配置筆記

作者: DWDROME 維護時間: 2025-03-22 參考文章:Windows子系統(WSL)通過橋接網絡實現被外部局域網主機直接訪問 WSL 環境橋接與雷達通信配置筆記 環境說明 Windows 11 專業版(啟用 Hyper-V)WSL2 Ubuntu 20.04物理網線&#xff08…

ToDesk云電腦各類鼠標有什么區別?虛擬/3D/游戲鼠標等各有利

不知道各位在使用ToDesk云電腦的時候是否是有注意到,這其中的鼠標竟有多種名稱、多種模式可以選,比如鎖定鼠標、3D鼠標、游戲鼠標這幾項。 那么這些不同名稱的鼠標都代表什么意思吶,又應該怎么選擇、怎么用吶?本篇內容小編就為大…

DeepBI:重構流量邏輯,助力亞馬遜廣告實現高效流量增長

在日益激烈的跨境電商競爭環境中,廣告投放早已從“粗放撒網”走向“精細化運營”。尤其是在亞馬遜這樣一個成熟且競爭白熱化的平臺,如何在廣告預算有限的前提下實現高效曝光、精準觸達、穩定轉化,成為眾多賣家和運營團隊面臨的核心挑戰。 De…

java項目之基于ssm的畢業論文管理系統(源碼+文檔)

項目簡介 畢業論文管理系統實現了以下功能: 本畢業論文管理系統主要實現的功能模塊包括學生模塊、導師模塊和管理員模塊三大部分,具體功能分析如下: (1)導師功能模塊:導師注冊登錄后主要功能模塊包括個人…

【自學筆記】Linux基礎知識點總覽-持續更新

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 Linux 基礎知識點總覽目錄Linux 簡介文件和目錄結構常用命令文件操作目錄操作權限管理文本處理 Shell 腳本基礎進程管理用戶和組管理網絡配置 總結 Linux 基礎知識點…

【PCB工藝】晶體管的發展歷史

晶體管被認為是20世紀最偉大的發明之一,因為沒有晶體管就不會有現代電腦、手機或平板??,你也無法閱讀到這里的內容,因為不存在網絡。 ——本文純粹出于對過往奮斗在這個領域中科學家的緬懷。科學家有太多寶貴的思想和經驗值得我們認真總結和…

第23章:Kubernetes網絡模型深度剖析

第23章:Kubernetes網絡模型深度剖析 作者:DogDog_Shuai 閱讀時間:約25分鐘 難度:高級 目錄 1. 引言2. Kubernetes網絡模型基礎3. 四種網絡通信模式4. CNI架構深度解析5. 網絡實現原理

HTML應用指南:利用GET請求獲取貓眼電影日票房信息——以哪吒2為例

2025年春節檔期,國產動畫電影《哪吒之魔童鬧海》(以下簡稱《哪吒2》)以顛覆性的敘事風格與工業化制作水準震撼登場,不僅刷新了中國動畫電影的票房紀錄,更成為全球影史現象級作品。影片憑借春節檔期的爆發式開局、持續5…

Model Context Protocol:下一代AI系統集成范式革命

在2023年全球AI工程化報告中,開發者面臨的核心痛點排名前三的分別是:模型與業務系統集成復雜度(58%)、上下文管理碎片化(42%)、工具調用標準化缺失(37%)。傳統API集成模式在對接大語言模型時暴露明顯短板:RESTful接口無法承載動態上下文,GraphQL缺乏工具編排能力,gR…

Java 鎖機制全面解析

在 Java 并發編程中,鎖(Lock)是保證線程安全的關鍵工具。本文將全面介紹 Java 的鎖機制,包括 synchronized 關鍵字、Lock 接口及其實現、讀寫鎖、樂觀鎖與悲觀鎖等,幫助新手理解 Java 并發控制。 1. Java 中的鎖概述 …