ThreadManager
大文件 and 多下载任务的封装一
大文件 and 多下载任务的封装二
原文地址
上两篇文章中我们主要讲述了ThreadPool ,以及 Observer(观察者模式)这些基本的工具类只是起到了辅助的作用,现在我们来分析一下,直接从网络上;拉取数据的过程,
一.断电续传的操作原理\
首先我们假设读者都已经了解了基本的从网络上拉取数据文件的操作,那么现在我们只需要在原有的基础上增加一个方法,在HttpURLConnection类中提供了一个方法,
//设置范围,格式为Range:bytes x-y;
//也就是从currentPos 下载到 Maxsize,这个方法可以满足断点续传操作,我们要做的只是保存下载进度,然后调用这个方法即可
.setRequestProperty("Range", "bytes=" + currentPos + "-" + Maxsize);`
二.子线程的实现
根据第一篇文章我们可以了解到,如果想要使用线程池必须动态的添加与移除子线程,所以为了方便操作,我们可以新建一个类来执行下载的操作,伪代码如下:
//用来执行下载操作
class DownLoadTask implements Runnable{
@Override
public void run() {
// 1.设置范围,格式为Range:bytes x-y;
connection.setRequestProperty("Range", "bytes=" + dlInfo.currentPos + "-" + dlInfo.size);
randomAccessFile = new RandomAccessFile(file, "rwd");
//2.从当前已下载节点开始保存文件
randomAccessFile.seek(0 + dlInfo.currentPos);
//3.将要下载的文件写到保存在保存路径下的文件中
is = connection.getInputStream();
byte[] buffer = new byte[4096];
int length = -1;
while ((length = is.read(buffer)) != -1) {
randomAccessFile.write(buffer, 0, length);
currentPos += length;
}
}
}
三.使用
下面将给出ThreadManager,DownLoadManager 在一块完成文件下载的使用过程
DownLoadServer down = new DownLoadServer(){};
mDM = DownLoadManager.getInstance();
mDM.registerObserver(this);// 注册观察者, 监听状态和进度变化
mDM.download((T extends DownLoadInfo));
四.代码
DownLoadManager.java
//
package com.example.orchid.googleplatstore.manager;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import com.example.orchid.googleplatstore.Utils.IOUtils;
import com.example.orchid.googleplatstore.Utils.UIUtils;
import com.example.orchid.googleplatstore.http.HttpHelper;
import com.example.orchid.googleplatstore.ui.domin.Appinfo;
import com.example.orchid.googleplatstore.ui.domin.DownLoadInfo;
import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by orchid
* on 16-11-4.
* 使用观察者设计模式
* 1.创建被观察者模式的接口
* 2.创建被观察者集合,用来保存所有的观察者
* 3.注册观察者--将观察者接口,添加到集合中
* 4.注销观察者--将观察者接口从集合中移除
* 5.更新数据提醒观察者--循环遍历所有的观察者,状态,进度改变调用方法
*
*下载的状态分为六种,未下载--等待--下载中--暂停--下载错误--下载成功
*
*/
public class DownLoadManager {
private static