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. }  
  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容