1. 程式人生 > >android多執行緒斷點續傳原理解析

android多執行緒斷點續傳原理解析

在下載大檔案的時候,我們往往要使用多執行緒斷點續傳,保證資料的完整性

下面我來解析一下多執行緒斷點續傳的原理

首先說多執行緒,我們要多執行緒下載一個大檔案,就有開啟多個執行緒,多個connection,既然是一個檔案分開幾個執行緒來下載,那肯定就是一個執行緒下載一個部分,不能重複

那麼我們這麼確定一個執行緒下載一部分呢

就需要我們在請求的header裡面設定

conn.setRequestProperty("Range", "bytes="+startPos+"-"+endPos);

這裡startPos是指從資料端的哪裡開始,endPos是指資料端的結束

根據這樣我們就知道,只要多個執行緒,按順序指定好開始跟結束,就可以不衝突的下載了

那麼我們寫檔案的時候又該怎麼寫呢

  1. byte[] buffer = new byte[1024];
  2. int offset = 0;
  3. print("Thread "+this.threadId+" starts to download from position "+startPos);
  4. RandomAccessFile threadFile = new RandomAccessFile(this.saveFile,"rwd");
  5. threadFile.seek(startPos);
  6. ...
  7. threadFile.write(buffer,0,offset);

從上面程式碼可以看出,每個執行緒找到自己開始寫的位置,就是seek(startPos)

這樣就可以保證資料的完整性,也不會重複寫入了

基本上多執行緒的原理就是這樣,其實也很簡單

那麼我們接著說斷點續傳,斷點續傳其實也很簡單,原理就是使用資料庫儲存上次每個執行緒下載的位置和長度

例如我開了兩個執行緒T1,T2來下載一個檔案,設檔案總大小為1024M,那麼就是每個執行緒下載512M

可是我的下載中斷了,那麼我下次啟動執行緒的時候(繼續下載),是不是應該要知道,我原來下載了多少呢

所以是這樣的,我沒下載一點,就更新資料庫的資料,

例如T1,下載了100M,就要實時更新資料庫,記錄下100M,並且記錄下這個執行緒開始下載位置(startPos),還有執行緒負責的長度(512M)

那麼我繼續下載的時候,就可以像伺服器請求startPos+1000M開始的資料了,然後在檔案裡面也是seek(startPos+1000M)的位置繼續下載,就可以實現斷點續傳了

OK,原理到這裡就結束了,順便提一句,在實際過程中,我們往往要使用進度條提示下載進度

這是我們可以啟動一個執行緒,專門負責進度的更新,並且實時監聽T1,T2執行緒的情況,

所以我們最好建立一個LISTNER介面比較方便,當然,這就比較簡單了