第一阶段 串联流程 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老兄的有心课堂-自己动手写多任务下载框架
相关文章推荐
- 利用Java的String类来完成字符编码转换
- 编程习惯-enum的用法
- Python中closure和generator的定义和使用 (兼谈yield命令)
- 【C#之栈和堆初遇】
- C++设计模式之状态模式(四)
- RabbitMQ入门教程 For Java【6】 - Remote procedure call (RPC)
- 写一下ubuntu下的vsftpd吧
- JVM学习笔记(一)---JVM基本结构
- 关掉rockmongo因PHP版本问题导致的警告显示
- ASP.NET MVC学习之Ajax(完结)
- 使用VS2013自带的PreEmptive Dotfuscator and Analytis来混淆C#代码
- python下载文件的三种方法
- java中数据类型在方法调用后的变化
- python os.system()返回值判断
- ActiveMQ(5.10.0) - Spring Support
- Eclipse启动报错 java was started but returned code=14
- [资料收集]Java问题解决
- Java将字节转换为十六进制代码分享
- java中数字类型转换
- windows下编译LUA-cjson