Android入门:多线程断点下载
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
- package service;
- import Android.content.Context;
- package service;
- import java.util.HashMap;
- import java.util.Map;
- import android.content.Context;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- /**
- * 业务bean
- *
- */
- public class FileService {
- private DBOpenHelper openHelper;
- public FileService(Context context) {
- openHelper = new DBOpenHelper(context);
- }
- /**
- * 获取每条线程已经下载的文件长度
- * @param path
- * @return
- */
- public Map<Integer, Integer> getData(String path){
- SQLiteDatabase db = openHelper.getReadableDatabase();
- Cursor cursor = db.rawQuery("select threadid, downlength from filedownlog where downpath=?", new String[]{path});
- Map<Integer, Integer> data = new HashMap<Integer, Integer>();
- while(cursor.moveToNext()){
- data.put(cursor.getInt(0), cursor.getInt(1));
- }
- cursor.close();
- db.close();
- return data;
- }
- /**
- * 保存每条线程已经下载的文件长度
- * @param path
- * @param map
- */
- public void save(String path, Map<Integer, Integer> map){//int threadid, int position
- SQLiteDatabase db = openHelper.getWritableDatabase();
- db.beginTransaction();
- try{
- for(Map.Entry<Integer, Integer> entry : map.entrySet()){
- db.execSQL("insert into filedownlog(downpath, threadid, downlength) values(?,?,?)",
- new Object[]{path, entry.getKey(), entry.getValue()});
- }
- db.setTransactionSuccessful();
- }finally{
- db.endTransaction();
- }
- db.close();
- }
- /**
- * 实时更新每条线程已经下载的文件长度
- * @param path
- * @param map
- */
- public void update(String path, Map<Integer, Integer> map){
- SQLiteDatabase db = openHelper.getWritableDatabase();
- db.beginTransaction();
- try{
- for(Map.Entry<Integer, Integer> entry : map.entrySet()){
- db.execSQL("update filedownlog set downlength=? where downpath=? and threadid=?",
- new Object[]{entry.getValue(), path, entry.getKey()});
- }
- db.setTransactionSuccessful();
- }finally{
- db.endTransaction();
- }
- db.close();
- }
- /**
- * 当文件下载完成后,删除对应的下载记录
- * @param path
- */
- public void delete(String path){
- SQLiteDatabase db = openHelper.getWritableDatabase();
- db.execSQL("delete from filedownlog where downpath=?", new Object[]{path});
- db.close();
- }
- }
|
评论暂时关闭