Android 开发手册 / Android 文件下载(2)

Android 文件下载(2)

本节引言:

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


Android多线程断点下载的代码流程解析:

运行效果图

1.gif

实现流程全解析


Step 1:创建一个用来记录线程下载信息的表

创建数据库表,于是乎我们创建一个数据库的管理器类,继承SQLiteOpenHelper类 重写onCreate()与onUpgrade()方法,我们创建的表字段如下:

2.jpg

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())