使用FileDownloader提升下載速度辦法

FileDownLoader框架在下載稍微大一點的文件時,下載速度不理想遮精,經(jīng)過實踐發(fā)現(xiàn)居夹,出現(xiàn)問題的原因主要體現(xiàn)在兩點:
1、本身的bug本冲。
2准脂、下載策略的問題。

先說第一點:

1眼俊、本身的bug:

bug源自于框架本身的分塊策略:

   // 1 connection: [0, 1MB)
    private static final long ONE_CONNECTION_UPPER_LIMIT = 1024 * 1024; // 1MB
    // 2 connection: [1MB, 5MB)
    private static final long TWO_CONNECTION_UPPER_LIMIT = 5 * 1024 * 1024; // 5MB
    // 3 connection: [5MB, 50MB)
    private static final long THREE_CONNECTION_UPPER_LIMIT = 50 * 1024 * 1024; // 50MB
    // 4 connection: [50MB, 100MB)
    private static final long FOUR_CONNECTION_UPPER_LIMIT = 100 * 1024 * 1024; // 100MB

    @Override
    public int determineConnectionCount(int downloadId, String url, String path, long totalLength) {
        if (totalLength < ONE_CONNECTION_UPPER_LIMIT) {
            return 1;
        }

        if (totalLength < TWO_CONNECTION_UPPER_LIMIT) {
            return 2;
        }

        if (totalLength < THREE_CONNECTION_UPPER_LIMIT) {
            return 3;
        }

        if (totalLength < FOUR_CONNECTION_UPPER_LIMIT) {
            return 4;
        }

        return 5;
}

默認邏輯是根據(jù)不同的文件大小意狠,創(chuàng)建的下載連接數(shù)也不一樣,文件總量越大疮胖,創(chuàng)建的塊也越多环戈,最大是5闷板。在多個塊的下載時候,框架內(nèi)部可能對下載任務沒有協(xié)調(diào)好院塞,導致會偶現(xiàn)下載任務停住的問題遮晚,這樣就給人一種下載很慢的感覺。

解決方案:
在Application中進行設置拦止,將塊的數(shù)量固定為1,這樣可以解決偶現(xiàn)卡死的問題县遣。

 private void initFileDownload() {
        FileDownloader.setupOnApplicationOnCreate(this)
                .connectionCreator(new FileDownloadUrlConnection
                        .Creator(new FileDownloadUrlConnection.Configuration()
                        .connectTimeout(15_000) // set connection timeout.
                        .readTimeout(15_000) // set read timeout.
                ))
                .connectionCountAdapter((downloadId, url, path, totalLength) -> {
                    return 1;//下載文件塊數(shù)是1,解決偶現(xiàn)的下載任務停止問題。
                })
                .commit();
    }

作者的初衷可能也為了讓下載速度有一個平衡才做了這樣一個分塊策略汹族。
雖然我們規(guī)避了bug萧求,但強行將塊設置為1的話顶瞒,下載速度肯定是不如多個塊下載的,為了彌補這些損失守问,同時為了讓本身的下載速度有進一步提升坑资,我們做了第二點—下載策略的修改。

2仿便、下載策略的問題攒巍。

所謂的策略,其實就是為了尋求某個平衡。
每一條小的策略肯定都有它的優(yōu)點和缺點枕屉,為什么要這么做都有它的理由,如何定制一個最完美平衡的策略西潘,需要我們開發(fā)者根據(jù)自己的需求去達成哨颂。

先看本身的下載策略有助于我們對 “為什么這樣下載不是很快,改完就很快”這個問題的理解品姓。
默認策略一:

  1. process.non-separate=true // 開啟子進程

為什么要這樣:
默認開啟子進程,根據(jù)作者的說法是腹备,為了兼容老版本,保持行為的一致性镀岛。

帶來的問題:

  • 子進程和主進程頻繁IPC衅码,對CPU資源有著大量的消耗。
  • IPC過程中產(chǎn)生大量的I/O事件,數(shù)據(jù)傳輸成本高

解決這些不必要的通信事件 艾猜,設置為

process.non-separate=false // 直接在主進程中下, 可以有效減少IPC產(chǎn)生的I/O

默認策略二:

BaseDownloadTask#setCallbackProgressIgnored(void)
或者
FileDownloadQueueSet#ignoreEachTaskInternalProgress(void)
//忽略掉下載過程中的大量的進度值回調(diào)淤毛,減少計算進度而帶來CPU的I/O消耗算柳。

在我們的實際場景中,進度值是根據(jù)下載任務數(shù)/總?cè)蝿諗?shù)來計算的蔗蹋,而不是每一個下載小任務的進度回調(diào)囱淋。
所以我們根本用不上進度回調(diào),直接加上這兩條策略之一即可皂吮。

默認策略三:

download.max-network-thread-count=3
//默認開啟3個線程下載税手,進程數(shù)區(qū)間在[1,12]。

下載線程越多當然更快艺挪,我們開啟8-10個兵扬,提升效果明顯口蝠。

默認策略四:

download.min-progress-step = 65536
最小緩沖大小掂器,用于判定是否是時候?qū)⒕彌_區(qū)中進度同步到數(shù)據(jù)庫,以及是否是時候要確保下緩存區(qū)的數(shù)據(jù)都已經(jīng)寫文件灭必。值越小乃摹,更新會越頻繁,下載速度會越慢孵睬,但是應對進程被無法預料的情況殺死時會更加安全

這個改不改影響不大,正常情況不會下載那么長時間秘狞,如果有較大的問題可以酌情設置蹈集。

默認策略五:

ddownload.min-progress-time=2000
最小緩沖時間,用于判定是否是時候?qū)⒕彌_區(qū)中進度同步到數(shù)據(jù)庫减响,以及是否是時候要確保下緩存區(qū)的數(shù)據(jù)都已經(jīng)寫文件。值越小支示,更新會越頻繁鄙才,下載速度會越慢,但是應對進程被無法預料的情況殺死時會更加安全

設置為5000秒据途,意外殺死的情況較少叙甸,并且較小的進度損失可以接受裆蒸。

在assets文件夾底下創(chuàng)建一個filedownloader.properties文件糖驴,將上述配置引入即可佛致。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俺榆,一起剝皮案震驚了整個濱河市装哆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萍桌,老刑警劉巖凌简,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異藕施,居然都是意外死亡凸郑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憨愉,“玉大人,你說我怎么就攤上這事径密。” “怎么了享扔?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵惧眠,是天一觀的道長于个。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么捶码? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任惫恼,我火速辦了婚禮,結(jié)果婚禮上祈纯,老公的妹妹穿的比我還像新娘。我一直安慰自己盆繁,他們只是感情好油昂,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布倾贰。 她就那樣靜靜地躺著,像睡著了一般安寺。 火紅的嫁衣襯著肌膚如雪首尼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天迎捺,我揣著相機與錄音查排,去河邊找鬼。 笑死岖瑰,一個胖子當著我的面吹牛砂代,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播露戒,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撩鹿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤节沦,失蹤者是張志新(化名)和其女友劉穎甫贯,沒想到半個月后看蚜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年音诫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梨撞。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡香罐,死狀恐怖穴吹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啥容,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布咪惠,位于F島的核電站淋淀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炭臭。R本人自食惡果不足惜鞋仍,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望落午。 院中可真熱鬧肚豺,春花似錦、人聲如沸梗劫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聚凹,卻和暖如春妒牙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敢朱。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工摩瞎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拴签,地道東北人蚓哩。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓岸梨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親半开。 傳聞我的和親對象是個殘疾皇子赃份,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355