1. 程式人生 > >多執行緒斷點續傳(一)

多執行緒斷點續傳(一)

一、 學習內容

1、 基本UI定義
2、 資料庫的操作
3、 Service的啟動
4、 Activity給service傳遞引數
5、 使用廣播回傳資料到Activity
6、 執行緒和Handler
7、 網路操作:檔案的寫入,網路往本地磁碟寫入
效果圖

二、 網路下載的具體流程圖

流程圖

三、 網路下載的關鍵點

1、 獲得網路檔案的長度
2、 在本地建立一個檔案,設定其長度
3、 從資料庫中獲得上次下載的進度
4、 從上次下載的位置下載資料,同時儲存進度到資料庫
5、 將下載進度回傳Activity
6、 下載完成後刪除下載資訊

四、 斷點續傳步驟

1、 設定檔案長度

1) 連線網路檔案
2) 獲取檔案長度
3) 在本地建立檔案
4) 設定檔案長度

2、 斷點續傳

1) 將執行緒資訊儲存到資料庫中
2) 設定下載位置
3) 設定檔案寫入位置
4) 開始下載

3、 下載檔案

1) 開始下載
2) 讀取資料
3) 寫入檔案
4) 在下載暫停時,儲存下載進度
5) 把下載進度傳送廣播給Activity

五、 學習點

1、 startService(intent)

第一次啟動的時候,會去建立service,當service已經啟動後,不會再去建立,而是會把intent的引數繼續傳遞給service,service通過onStartCommend接收引數

2、 網路操作用多執行緒處理

多執行緒

3、 GET和POST方式來獲取資料

get請求

4、 Http請求下載

1) 設定獲取實體資料的範圍
conn.setRequestProperty(“Range”, “bytes=” + start + “-” + end);
2) 響應狀態碼
HttpStatus.SC_OK = 200

5、 RandomAccessFile

1) 在檔案的任意位置進行寫入操作,這樣就實現了斷點續傳
2) RandomAccessFile raf = new RandomAccessFile(File file, String mode);

3) 檔案模式mode:
檔案模式mode

4) 設定檔案寫入位置:raf.seek(index);
raf.seek

6、 Handler傳送訊息

mHandler.obtainMessage(String MSG, Object obj).sendToTarget();

六、 案例小結

1、 Activity是如何與Service進行互動的?

1) Activity通過Intent,設定action,startService傳遞Intent
2) Service通過onStartCommand去接收Intent
3) Service通過sendBroadcast 傳送廣播,通過Intent,設定action,將資料傳遞給Activity
4) Activity定義BroadcastReceiver廣播接受者,獲取Intent,根據action,將進度資訊設定給Progress。
5) Activity需要建立IntentFilter篩選器,registerReceiver註冊廣播接受者。

2、 檔案下載是如何實現的?

1) 開啟網路操作的連線
2) 設定檔案的下載的位置,通過Range這個屬性

如果伺服器沒有相關的配置的話,那麼getInputStream返回的資料依舊是整個檔案,獲得的responseCode == 200,如果配置過得responseCode == 206    ( 我在這裡踩過坑 )

3) RandomAccessFile設定檔案寫入位置

3、 斷點續傳是如何實現的?

1) 斷開的時候,將下載資訊儲存更新到資料庫中
2) 續傳的時候,從資料庫中讀取下載資訊,繼續下載

4、 Service在案例中起到什麼作用?

1) Activity是可以被使用者關閉的,被Android系統回收,如果執行緒開啟了,Activity被關閉了,就沒有辦法對執行緒進行管理,是非常不安全的。
2) Service是後臺元件,沒有辦法和使用者互動,而且優先順序級別比較高,一般不會被Android系統回收,把一下重要的事情,執行緒的啟動和操作,放在Service中會比較安全。


【Demo】