歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android入門:多線程斷點下載

Android入門:多線程斷點下載

日期:2017/3/1 10:16:45   编辑:Linux編程

一、多線程斷點下載介紹
所謂的多線程斷點下載就是利用多線程下載,並且可被中斷,如果突然沒電了,重啟手機後可以繼續下載,而不需要重新下載;利用的技術有:SQLite存儲各個線程的下載量,HTTP請求獲得下載數據;

二、輔助類介紹
為了完成多線程斷點下載我們需要預先編寫一些輔助類:
(1)DBOpenHelper
(2)FileService:
-Map<Integer,Integer> getData(String path); 根據URL獲得各個線程的下載量
-save(String path, Map<Integer, Integer> map);存儲URL對應的各個線程下載量,此函數為剛剛開始時調用
-update(String path, Map<Integer, Integer> map);更新數據庫中URL對應的各個線程的下載量;
-delete(String path);刪除URL對應的數據;
(3)FileDownloader:
-getFileSize();獲得下載文件的大小
-download(DownloadProgressListener listener);下載文件,並設置監聽器
(4)DownloadThread:此類在FileDownloader的download中執行;
先將輔助類列出:
DBOpenHelper.java

  1. package service;
  2. import Android.content.Context;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.database.sqlite.SQLiteOpenHelper;
  5. public class DBOpenHelper extends SQLiteOpenHelper {
  6. private static final String DBNAME = "download.db";
  7. private static final int VERSION = 1;
  8. public DBOpenHelper(Context context) {
  9. super(context, DBNAME, null, VERSION);
  10. }
  11. @Override
  12. public void onCreate(SQLiteDatabase db) {
  13. db.execSQL("CREATE TABLE IF NOT EXISTS filedownlog (id integer primary key autoincrement, downpath varchar(100), threadid INTEGER, downlength INTEGER)");
  14. }
  15. @Override
  16. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  17. db.execSQL("DROP TABLE IF EXISTS filedownlog");
  18. onCreate(db);
  19. }
  20. }
FileService.java
  1. package service;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import android.content.Context;
  5. import android.database.Cursor;
  6. import android.database.sqlite.SQLiteDatabase;
  7. /**
  8. * 業務bean
  9. *
  10. */
  11. public class FileService {
  12. private DBOpenHelper openHelper;
  13. public FileService(Context context) {
  14. openHelper = new DBOpenHelper(context);
  15. }
  16. /**
  17. * 獲取每條線程已經下載的文件長度
  18. * @param path
  19. * @return
  20. */
  21. public Map<Integer, Integer> getData(String path){
  22. SQLiteDatabase db = openHelper.getReadableDatabase();
  23. Cursor cursor = db.rawQuery("select threadid, downlength from filedownlog where downpath=?", new String[]{path});
  24. Map<Integer, Integer> data = new HashMap<Integer, Integer>();
  25. while(cursor.moveToNext()){
  26. data.put(cursor.getInt(0), cursor.getInt(1));
  27. }
  28. cursor.close();
  29. db.close();
  30. return data;
  31. }
  32. /**
  33. * 保存每條線程已經下載的文件長度
  34. * @param path
  35. * @param map
  36. */
  37. public void save(String path, Map<Integer, Integer> map){//int threadid, int position
  38. SQLiteDatabase db = openHelper.getWritableDatabase();
  39. db.beginTransaction();
  40. try{
  41. for(Map.Entry<Integer, Integer> entry : map.entrySet()){
  42. db.execSQL("insert into filedownlog(downpath, threadid, downlength) values(?,?,?)",
  43. new Object[]{path, entry.getKey(), entry.getValue()});
  44. }
  45. db.setTransactionSuccessful();
  46. }finally{
  47. db.endTransaction();
  48. }
  49. db.close();
  50. }
  51. /**
  52. * 實時更新每條線程已經下載的文件長度
  53. * @param path
  54. * @param map
  55. */
  56. public void update(String path, Map<Integer, Integer> map){
  57. SQLiteDatabase db = openHelper.getWritableDatabase();
  58. db.beginTransaction();
  59. try{
  60. for(Map.Entry<Integer, Integer> entry : map.entrySet()){
  61. db.execSQL("update filedownlog set downlength=? where downpath=? and threadid=?",
  62. new Object[]{entry.getValue(), path, entry.getKey()});
  63. }
  64. db.setTransactionSuccessful();
  65. }finally{
  66. db.endTransaction();
  67. }
  68. db.close();
  69. }
  70. /**
  71. * 當文件下載完成後,刪除對應的下載記錄
  72. * @param path
  73. */
  74. public void delete(String path){
  75. SQLiteDatabase db = openHelper.getWritableDatabase();
  76. db.execSQL("delete from filedownlog where downpath=?", new Object[]{path});
  77. db.close();
  78. }
  79. }
Copyright © Linux教程網 All Rights Reserved