歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android入門:多線程斷點下載

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