首先,我们定义一下下载中的各个状态:
public class DownloadStatus {
public static final int IDLE = 233; // 空闲,默认状态
public static final int COMPLETED = 234; // 完成
public static final int DOWNLOADING = 235; // 下载中
public static final int PAUSE = 236; // 暂停
public static final int ERROR = 237; // 出错
}
可以看到,这里定义了如上的五种状态。
基本辅助类的抽象
这里需要用到如数据库及 HTTP 请求的功能,我们这里定义其接口如下,具体实现各位可以根据需要自己实现:
数据库辅助类
public interface DownloadDbHelper {
/**
- 从数据库中删除子任务记录
- @param task 子任务记录
*/
void delete(SubDownloadTask task);
/**
- 向数据库中插入子任务记录
- @param task 子任务记录
*/
void insert(SubDownloadTask task);
/**
- 在数据库中更新子任务记录
- @param task 子任务记录
*/
void update(SubDownloadTask task);
/**
- 获取所有指定Task下的子任务记录
- @param taskTag Task的Tag
- @return 子任务记录
*/
List queryByTaskTag(String taskTag);
}
Http 辅助类
public interface DownloadHttpHelper {
/**
- 获取文件总长度
- @param url 下载url
- @param callback 获取文件长度CallBack
*/
void getTotalSize(String url, NetCallback callback);
/**
- 获取InputStream
- @param url 下载url
- @param start 开始位置
- @param end 结束位置
- @param callback 获取字节流的CallBack
*/
void getStreamByRange(String url, long start, long end, NetCallback callback);
}
子任务实现
成员变量及解释
我们先从上到下,从子任务开始实现。在我的设计中,它具有如下的成员变量:
@Entity
public class SubDownloadTask implements Runnable {
public static final int BUFFER_SIZE = 1024 * 1024;
private static final String TAG = SubDownl