您的位置:首页 > 编程语言

第一阶段 串联流程 TODO + 伪代码

2016-01-15 11:56 309 查看

准备类:

1、DownloadManager 下载入口类

分离View层和业务逻辑层,收集用户所有的动作,然后交给DownloadServer处理

2、DownloadServer 服务类

开启服务,在后台进行下载任务

3、DownloadEntry 下载实体类

4、DownloadTask 创建下载任务

5、Constant 常量声明类

6、DataWatcher 观察者

7、DataChanger 被观察者

8、DownloadThread 下载任务线程池

思路及实现:

1、从DownloadManager下载入口类写起

(1)创建单例模式,该类会被多次重复调用

private static DownloadManager mInstance;
private Context context;
private DownloadManager(Context context) {
this.context = context;
}

public static synchronized DownloadManager getInstance(Context context) {
if (mInstance == null) {
mInstance = new DownloadManager(context);
}

return mInstance;
}


(2)创建add方法,用户新增下载任务时调用该方法,在该方法中启动DownloadService,将下载任务实例和动作传递过去

public void add(DownloadEntry entry) {
Intent intent = new Intent(context, DownloadServer.class);
intent.putExtra(Constant.KEY_DOWNLOAD_ENTRY, entry);
intent.putExtra(Constant.KEY_DOWNLOAD_ACTION, Constant.KEY_DOWNLOAD_ACTION_ADD);
context.startService(intent);
}


2、DownloadService服务类,继承Service类

在onStartCommand方法中获取下载实例和动作

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
DownloadEntry entry = (DownloadEntry) intent.getSerializableExtra(Constant.KEY_DOWNLOAD_ENTRY);
int action = intent.getIntExtra(Constant.KEY_DOWNLOAD_ACTION, -1);
// 在doAction方法中根据动作类型执行相关操作
doAction(entry, action);

return super.onStartCommand(intent, flags, startId);
}


例如:add

private void doAction(DownloadEntry entry, int action) {
// check action do related action
switch (action) {
case Constant.KEY_DOWNLOAD_ADD:

break;
}
}


3、DownloadEntry

实现Serializable接口

public class DownloadEntry implements Serializable{
public String id;
public String name;
public String url;
public enum DownloadStatus{waiting, downloading, pause, resume, cancel};
public DownloadStatus status;
public int currentLength;
public int totalLength;
}


4、DataChanger,继承Observable

可能会被同时重复调用,单例模式

private static DataChanger mInstance;
private DataChanger() {}

public synchronized static DataChanger getInstance() {
if (mInstance == null) {
mInstance = new DataChanger();
}

return mInstance;
}


创建postStatus方法,通知观察者们更新数据

public void postStatus(DownloadEntry entry) {
setChanged();
notifyObservers(entry);
}


5、DataWatcher,实现Observer接口

public abstract class DataWatcher implements Observer{

@Override
public void update(Observable observable, Object data) {
if (data instanceof DownloadEntry) {
notifyUpdate((DownloadEntry)data);
}
}

// 将数据传递到外部,具体变化由外部实现操作
public abstract void notifyUpdate(DownloadEntry data);
}


6、最后回到DownloadManager类中,创建注册观察者和删除观察者的方法

对外暴露的只有DownloadManger类中的addObserver和removeObserver方法,调用者是不会知道DataChanger的存在,就不会修改DataChanger中的数据

public void addObserver(DataWatcher watcher) {
DataChanger.getInstance().addObserver(watcher);
}

public void removeObserver(DataWatcher watcher) {
DataChanger.getInstance().deleteObserver(watcher);
}


相关知识来源:

stay老兄的有心课堂-自己动手写多任务下载框架
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: