android 多線程斷點下載及進度實時更新demo

demo 下載地址:

https://download.csdn.net/download/u010672559/10549120

1.概述:

此demo是網上參考別人的demo的基礎上做的修改實現的多線程斷點下載及進度實時更新功能,此demo可直接運行,內部下載apk地址可直接使用,不用自己搭服務器環境,個人覺得直接看代碼可能還掌握這個知識點還快點,網上很多貼了很多代碼,沒實際可運行的demo,自己去調比較費時間,還不如先運行demo看現象,發現demo能需求滿足功能,然後再具體看下demo邏輯,自己直接搬過去用效率要高的多,時間多就自己把細節邏輯理解下,方便調具體實際問題及優化邏輯

2.demo操作及邏輯說明:

點擊開始下載-顯示進度-停止下載-開始下載-下載完成後-點擊跳轉安裝apk
邏輯:點擊開始下載-啓動線程池去啓動多個runable,運行多線程,runable中具體實現單個下載任務,下載的時候每隔一定時間通過數據庫去保存各個下載任務裏面的下載長度,當中間點擊了停止下載時,再次點擊開始下載會先去讀取保存的下載信息,然後通過保存的下載信息位置處繼續下載,下載完成之後接口回調下載完成信息,點擊跳轉apk可跳轉到系統安裝apk界面

3.部分邏輯說明:

DownloaderDBHelper和DownloadProgressManager爲數據庫邏輯
DownloadRunnable爲具體下載實現邏輯
FileDownloader爲文件下載中間管理對象
DownloadManager啓動關閉邏輯

3.1關鍵代碼邏輯解釋:

while ((offset = inputStream.read(buffer, 0, 10240)) >0 && !downloadStopFlag && (downloadLength < perThreadMaxDownloadLength)) {
    threadFile.write(buffer, 0, offset);
    downloadLength += offset;
    fileDownloader.appendDownloadSize(offset);
}

即不停的讀數據,只要沒有按下停止下載downloadStopFlag一直爲false,然後downloadLength會一直累加,perThreadMaxDownloadLength爲每個線程最大下載的長度,即如果下載100M的內容,用5個線程去完成,則每個線程最多隻要下載20M即可,當數據讀完之後inputStream.read會返回<0的值,fileDownloader.appendDownloadSize(offset)會把每次read的數據傳出去,fileDownloader中也有個while循環不停的去記錄下載的進度,即UI更新及保存下載進度,然後通過接口傳出去給activity更新UI,之後會將每個線程的runable中的讀寫的實時長度downloadLength保存到數據庫中保存起來,fileDownloader中會不停的去檢測runable下載完成的標誌位有沒有置位,如果置位了則表示此線程任務已經完成

3.2MultiThreadTest\app\src\main\java\com\example\wzhang\multithreadtest\multithreaddownload\FileDownloader.java-start()中的Thread.sleep(1000);爲UI刷新的間隔時間,修改此值可修改UI更新時間

3.3數據庫有兩個,一個是保存每個線程的實時下載長度,一個是下載否完成的狀態

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章