以前在個人文章《Android高速下載器實現思路——單個任務的提速與優化》提到了一些下載器的實現方式。而後由於這學期實驗報告超級多,這個項目一鴿再鴿到如今基本成型了,作成了Android Library上傳到了Jitpack。java
項目傳送門git
歡迎下載sample體驗、start。github
根目錄的build.gradle
bash
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
全部的接口都經過YCDownloader的靜態方法導出,接口要麼經過方法名就能夠知道功能要麼有相應的文檔註釋說明。ide
文件傳送門post
若是還不清楚,項目中有一個現成的sample,涵蓋了這個庫常見的一些API的使用(做爲純粹的HTTP下載器,功能應該還算比較完整)。測試
須要注意的地方是,若是使用多線程,最好不要有其餘組建運行在:yc_downloader
進程,這個進程在庫的Manifest
已經註冊爲了遠程下載服務運行的進程。
上一篇文章中有提到把讀和寫的線程分離,按照讀、寫線程n:1的方式組織。實際上在以前實現時,這樣的方法最後達到的下載效率並非很高。
首先須要知道的是,讀寫線程分離確實能提高下載的速度,可是,讀寫線程比是一個重要的參數。在幾回實驗後發現,當讀寫線程爲n:1時,讀線程常常會被寫線程拖慢,由於寫線程只有一個,要處理多個線程下載下來的緩衝區的讀。寫完一個緩衝區後才能釋放給某個讀線程下載,而且還要被多個讀線程競爭。
所以,改變這種局面的方式,一個是減少讀寫線程比(增多寫線程),另外一個是使用雙緩衝(理論上緩衝區能夠適量繼續增長,但通常雙緩衝足夠了,一個寫一個讀循環使用,畢竟空間有開銷)。最後在實現中,採用的是每一個讀線程對應一個寫線程,而且有兩個緩衝區。
最後經過這種方式測試,下載速度基本能夠跑滿帶寬。