Android 开发手册
/ Android 文件下载(2)
Android 文件下载(2)
本节引言:
本节给大家带来的Android中的多线程断点续传的代码解析,呵呵,为什么叫解析呢?因为我 也写不出来,( ╯□╰ )!先来说说断点的意思吧!所谓的断点就是:使用数据库记录每天线程所 下载的进度!每次启动时根据线程id查询某线程的下载进度,在继续下载!听上去蛮简单的, 要你写十有八九写不出,这很正常,所以本节看懂最好,看不懂也没什么,会用和改就好! 好的,开始本节内容~
Android多线程断点下载的代码流程解析:
运行效果图:

实现流程全解析:
Step 1:创建一个用来记录线程下载信息的表
创建数据库表,于是乎我们创建一个数据库的管理器类,继承SQLiteOpenHelper类 重写onCreate()与onUpgrade()方法,我们创建的表字段如下:


DBOpenHelper.java:
package com.jay.example.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context) {
super(context, "downs.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
//数据库的结构为:表名:filedownlog 字段:id,downpath:当前下载的资源,
//threadid:下载的线程id,downlength:线程下载的最后位置
db.execSQL("CREATE TABLE IF NOT EXISTS filedownlog " +
"(id integer primary key autoincrement," +
" downpath varchar(100)," +
" threadid INTEGER, downlength INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//当版本号发生改变时调用该方法,这里删除数据表,在实际业务中一般是要进行数据备份的
db.execSQL("DROP TABLE IF EXISTS filedownlog");
onCreate(db);
}
}Step 2:创建一个数据库操作类
我们需要创建什么样的方法呢?
- ①我们需要一个根据URL获得每条线程当前下载长度的方法
- ②接着,当我们的线程新开辟后,我们需要往数据库中插入与该线程相关参数的方法
- ③还要定义一个可以实时更新下载文件长度的方法
- ④我们线程下载完,还需要根据线程id,删除对应记录的方法
FileService.java
package com.jay.example.db;
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);
}
/**
* 获得指定URI的每条线程已经下载的文件长度
* @param path
* @return
* */
public Map getData(String path)
{
//获得可读数据库句柄,通常内部实现返回的其实都是可写的数据库句柄
SQLiteDatabase db = openHelper.getReadableDatabase();
//根据下载的路径查询所有现场的下载数据,返回的Cursor指向第一条记录之前
Cursor cursor = db.rawQuery("select threadid, downlength from filedownlog where downpath=?",
new String[]{path});
//建立一个哈希表用于存放每条线程已下载的文件长度
Map data = new HashMap();
//从第一条记录开始遍历Cursor对象
cursor.moveToFirst();
while(cursor.moveToNext())
  -
教程导航