Android实现多任务多线程支持断点续传的下载软件

多任务多线程下载并不麻烦,只要思路清晰,逻辑清晰正确,是很好实现的。我最后遇到的纠结问题是数据库的操作上,我是拿数据库来存储下载信息的,所以在数据库的关闭上遇到了麻烦。上面那个版本是建立在前面N个demo的基础之上的,在这里我写下来的唯一目的就是能够以一个清晰的思路写清楚,同时让大家看明白。

运行效果图:

Android实现多任务多线程支持断点续传的下载软件

一、首先是数据库,

数据库五个字段:

任务的ID:_id

线程ID:thread_id

线程下载的起始位置:start_pos

这个线程下载的结束位置:end_pos

这个任务已经下载的大小:compelete_size

这个任务的下载地址:urlString

  1. create table download_info(_id integer PRIMARY KEY AUTOINCREMENT, thread_id integer,start_pos integer, end_pos integer, compelete_size integer,urlString char)  

二、操作数据库的类。在实现断点续传下载的时候,我是把线程每次下载结束后的当前任务信息都保存到数据库里面一次,相当于每次一个线程下载一次,就给当前任务拍个照片,把当前信息存到数据库里面。这样一旦暂停,或者退出程序,下次再下载的时候,直接从数据库里面读数据,然后在这个数据的基础上继续下载就行。

  1. package com.song.dao;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import Android.content.Context;  
  7. import android.database.Cursor;  
  8. import android.database.sqlite.SQLiteDatabase;  
  9.   
  10. import com.song.db.DBHelper;  
  11. import com.song.entity.ThreadDownloadInfo;  
  12.   
  13. /** 
  14.  * 操作数据库 
  15.  * @author song 
  16.  * 
  17.  */  
  18. public class DownloadDao  
  19. {  
  20.     private DBHelper dbHelper;  
  21.   
  22.     public DownloadDao(Context context)  
  23.     {  
  24.         dbHelper = new DBHelper(context);  
  25.     }  
  26.   
  27.     /** 
  28.      *  
  29.      * 判断数据库中是不是有对应这个urlString的信息 
  30.      *  
  31.      * @return 
  32.      */  
  33.     public boolean unhasInfo(String urlString)  
  34.     {  
  35.         SQLiteDatabase db = dbHelper.getReadableDatabase();  
  36.         String sql = "select count(*) from download_info where urlString=?";  
  37.         Cursor cursor = db.rawQuery(sql, new String[]{urlString});  
  38.         cursor.moveToFirst();  
  39.         int count = cursor.getInt(0);  
  40.         cursor.close();  
  41.         return count == 0;  
  42.     }  
  43.   
  44.     /** 
  45.      * 把线程信息保存在数据库里面 
  46.      * @param infos 
  47.      */  
  48.     public void saveInfos(List<ThreadDownloadInfo> infos)  
  49.     {  
  50.         SQLiteDatabase db = dbHelper.getWritableDatabase();  
  51.         for (ThreadDownloadInfo info : infos)  
  52.         {  
  53.             String sql = "insert into download_info(thread_id,start_pos, end_pos,compelete_size,urlString) values (?,?,?,?,?)";  
  54.             Object[] bindArgs =  
  55.             { info.getThreadId(), info.getStartPos(), info.getEndPos(),  
  56.                     info.getCompleteSize() ,info.getUrlString()};  
  57.             db.execSQL(sql, bindArgs);  
  58.         }  
  59.   
  60.     }  
  61.   
  62.     /** 
  63.      * 暂停之后,把当前数据保存在数据库中,该方法是从数据库中查询数据 
  64.      *  
  65.      * @return 
  66.      */  
  67.     public List<ThreadDownloadInfo> getInfos(String urlString)  
  68.     {  
  69.         List<ThreadDownloadInfo> list = new ArrayList<ThreadDownloadInfo>();  
  70.         SQLiteDatabase db = dbHelper.getReadableDatabase();  
  71.         String sql = "select thread_id, start_pos, end_pos,compelete_size, urlString from download_info where urlString=?";  
  72.         Cursor cursor = db.rawQuery(sql, new String[]{urlString});  
  73.         while (cursor.moveToNext())  
  74.         {  
  75.             ThreadDownloadInfo info = new ThreadDownloadInfo(cursor.getInt(0),  
  76.                     cursor.getInt(1), cursor.getInt(2), cursor.getInt(3),cursor.getString(4));  
  77.             list.add(info);  
  78.         }  
  79.         cursor.close();  
  80.         return list;  
  81.     }  
  82.   
  83.     /** 
  84.      * 把当前的数据照片 存进数据库中 
  85.      *  
  86.      * @param threadId 
  87.      * @param completeSize 
  88.      */  
  89.     public void updateInfo(int threadId, int completeSize,String urlString)  
  90.     {  
  91.         SQLiteDatabase db = dbHelper.getWritableDatabase();  
  92.         String sql = "update download_info set compelete_size=? where thread_id=? and urlString=?";  
  93.         Object[] bindArgs =  
  94.         { completeSize, threadId,urlString };  
  95.         db.execSQL(sql, bindArgs);  
  96.     }  
  97.   
  98.     /** 
  99.      * 关闭数据库 
  100.      */  
  101.     public void closeDB()  
  102.     {  
  103.         dbHelper.close();  
  104.     }  
  105.   
  106.     /** 
  107.      *  下载完成之后,从数据库里面把这个任务的信息删除 
  108.      *  不同的任务对应不同的urlString 
  109.      * @param urlString 
  110.      */  
  111.     public void deleteInfos(String urlString)  
  112.     {  
  113.         SQLiteDatabase db=dbHelper.getWritableDatabase();  
  114.         db.delete("download_info""urlString=?"new String[]{urlString});  
  115.     }  
  116. }  

数据库助手类DBhelper:

  1. package com.song.db;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteOpenHelper;  
  6. import android.util.Log;  
  7.   
  8. /** 
  9.  * 数据库助手类 
  10.  * @author song 
  11.  * 
  12.  */  
  13. public class DBHelper extends SQLiteOpenHelper  
  14. {  
  15.   
  16.     public DBHelper(Context context)  
  17.     {  
  18.         super(context, "download.db"null1);  
  19.     }  
  20.   
  21.     @Override  
  22.     public void onCreate(SQLiteDatabase db)  
  23.     {  
  24.         Log.v("TAG""DBHelper-->conCreate()");  
  25.         String sql = "create table download_info(_id integer PRIMARY KEY AUTOINCREMENT, thread_id integer,start_pos integer, end_pos integer, compelete_size integer,urlString char)";  
  26.         db.execSQL(sql);  
  27.     }  
  28.   
  29.     @Override  
  30.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)  
  31.     {  
  32.   
  33.     }  
  34.   
  35. }  

相关推荐