这篇文章把F-droid的下载功能经过修改单独拿出来,而且做了一个demo。
希望能对自己后续起到借鉴作用。各位童鞋也可以去进行下载。
其实主要的思想有2个
1、使用接口进行回调
2、线程直接调用回调,由于无法知道主线程是否进行UI操作,所以把线程的回调进行了包装,使用Handler来发消息。保证不会崩溃。
项目下载地址:
http://download.csdn.net/download/leehu1987/7979253
尚未完成的功能:
1、断点下载(需要数据库)
2、如果下载完成了,下次下载应该是不需要下载了。
缺陷:
一个下载线程只能注册一个监听,比较好的办法是可以使用观察者模式通知各个页面。后续进行优化下。
一、定义一个接口,用于页面下载状态的监听;
<pre class="java" name="code">import java.io.Serializable;
public interface DownloadListener {
public static class Data implements Serializable {
private static final long serialVersionUID = 8954447444334039739L;
private long currentSize;
private long totalSize;
public Data() {
}
public Data(int currentSize, int totalSize) {
this.currentSize = currentSize;
this.totalSize = totalSize;
}
public long getCurrentSize() {
return currentSize;
}
public void setCurrentSize(long currentSize) {
this.currentSize = currentSize;
}
public long getTotalSize() {
return totalSize;
}
public void setTotalSize(long totalSize) {
this.totalSize = totalSize;
}
@Override
public String toString() {
return "Data [currentSize=" + currentSize + ", totalSize="
+ totalSize + "]";
}
}
/**
*
* @param data
* : transfer downloaded data
*/
public void onProgress(Data data);
/**
*
* @param e
* : exception
*/
public void onError(Exception e);
public void onCompleted();
}
二、定义了一个Downloader父类,为了适应不同的下载,比如使用Http进行下载;使用代理进行下载等。
所以这个类是一个接口类,定义了一些基本的操作方法。
package com.example.downloader;