YCDownloader下載庫(多線程、多任務、多進程)

0x01 前言

以前在個人文章《Android高速下載器實現思路——單個任務的提速與優化》提到了一些下載器的實現方式。而後由於這學期實驗報告超級多,這個項目一鴿再鴿到如今基本成型了,作成了Android Library上傳到了Jitpack。java

項目傳送門git

歡迎下載sample體驗、start。github

0x02 集成

根目錄的build.gradlebash

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
複製代碼

在module的build.gradle中:多線程

dependencies {
    implementation 'com.github.SirLYC:YC-Downloader:latest.release'
}
複製代碼

Application中:異步

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        // multi process
        YCDownloader.install(this, true)
        // single process
        //        YCDownloader.install(this, false);
        // or
        //        YCDownloader.install(this);
    }
}
複製代碼

到這裏就已經啓動了下載服務。下載服務是和Application Context綁定的,目前暫未提供退出服務的接口。maven

0x03 使用

全部的接口都經過YCDownloader的靜態方法導出,接口要麼經過方法名就能夠知道功能要麼有相應的文檔註釋說明。ide

文件傳送門post

若是還不清楚,項目中有一個現成的sample,涵蓋了這個庫常見的一些API的使用(做爲純粹的HTTP下載器,功能應該還算比較完整)。測試

sample傳送門

須要注意的地方是,若是使用多線程,最好不要有其餘組建運行在:yc_downloader進程,這個進程在庫的Manifest已經註冊爲了遠程下載服務運行的進程。

0x04 有關上一篇文章的實際實現改進

上一篇文章中有提到把讀和寫的線程分離,按照讀、寫線程n:1的方式組織。實際上在以前實現時,這樣的方法最後達到的下載效率並非很高。

首先須要知道的是,讀寫線程分離確實能提高下載的速度,可是,讀寫線程比是一個重要的參數。在幾回實驗後發現,當讀寫線程爲n:1時,讀線程常常會被寫線程拖慢,由於寫線程只有一個,要處理多個線程下載下來的緩衝區的讀。寫完一個緩衝區後才能釋放給某個讀線程下載,而且還要被多個讀線程競爭。

所以,改變這種局面的方式,一個是減少讀寫線程比(增多寫線程),另外一個是使用雙緩衝(理論上緩衝區能夠適量繼續增長,但通常雙緩衝足夠了,一個寫一個讀循環使用,畢竟空間有開銷)。最後在實現中,採用的是每一個讀線程對應一個寫線程,而且有兩個緩衝區

最後經過這種方式測試,下載速度基本能夠跑滿帶寬。

0x05 後續維護/新功能

  • 若是有必要,添加退出服務的功能。
  • 對於下載文件的完整性校驗。或者說檢查下載文件相比於上一次下載是否過時(斷點續傳時)。
  • API可能須要調整的更加易於使用。目前不少API由於IPC的關係不能直接在主線程使用,須要異步的方式,後續可能會經過一些方式調整。
  • 若是有精力,能夠試着添加其餘協議的下載,好比很是常見的FTP下載。
  • 下載引擎部分基本已經成型,後續會基於當前版本的sample開發一個功能完整的下載器(有上架商店的想法)。
相關文章
相關標籤/搜索