android 封装类,android下载封装类

public class Download implements Serializable {

private static final int START = 1;                 // 开始下载

private static final int PUBLISH = 2;               // 更新进度

private static final int PAUSE = 3;                 // 暂停下载

private static final int CANCEL = 4;                // 取消下载

private static final int ERROR = 5;                 // 下载错误

private static final int SUCCESS = 6;               // 下载成功

private static final int GOON = 7;                  // 继续下载

private static ExecutorService mThreadPool;         // 线程池

static {

mThreadPool = Executors.newFixedThreadPool(5);  // 默认5个

}

private int mDownloadId;                            // 下载id

private String mFileName;                           // 本地保存文件名

private String mUrl;                                // 下载地址

private String mLocalPath;                          // 本地存放目录

private boolean isPause = false;                    // 是否暂停

private boolean isCanceled = false;                 // 是否手动停止下载

private OnDownloadListener mListener;               // 监听器

/**

* 配置下载线程池的大小

* @param maxSize 同时下载的最大线程数

*/

public static void configDownloadTheadPool(int maxSize) {

mThreadPool = Executors.newFixedThreadPool(maxSize);

}

/**

* 添加下载任务

* @param downloadId 下载任务的id

* @param url        下载地址

* @param localPath   本地存放地址

*/

public Download(int downloadId, String url, String localPath) {

if (!new File(localPath).exists()) {

new File(localPath).mkdirs();

}

Log.log("下载地址;" + url);

mDownloadId = downloadId;

mUrl = url;

String[] tempArray = url.split("/");

mFileName = tempArray[tempArray.length-1];

mLocalPath = localPath;

}

/**

* 设置监听器

* @param listener 设置下载监听器

* @return this

*/

public Download setOnDownloadListener(OnDownloadListener listener) {

mListener = listener;

return this;

}

/**

* 获取文件名

* @return 文件名

*/

public String getFileName() {

return mFileName;

}

/**

* 开始下载

* params isGoon是否为继续下载

*/

public void start(final boolean isGoon) {

// 处理消息

final Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case ERROR:

mListener.onError(mDownloadId);

break;

case CANCEL:

mListener.onCancel(mDownloadId);

break;

case PAUSE:

mListener.onPause(mDownloadId);

break;

case PUBLISH:

mListener.onPublish(mDownloadId, Long.parseLong(msg.obj.toString()));

break;

case SUCCESS:

mListener.onSuccess(mDownloadId);

break;

case START:

mListener.onStart(mDownloadId, Long.parseLong(msg.obj.toString()));

break;

case GOON:

mListener.onGoon(mDownloadId, Long.parseLong(msg.obj.toString()));

break;

}

}

};

// 真正开始下载

mThreadPool.execute(new Runnable() {

@Override

public void run() {

download(isGoon,handler);

}

});

}

/**

* 下载方法

* @param handler 消息处理器

*/

private void download(boolean isGoon, Handler handler) {

Message msg = null;

Log.log("开始下载。。。");

try {

RandomAccessFile localFile = new RandomAccessFile(new File(

mLocalPath + File.separator + mFileName), "rwd");

DefaultHttpClient client = new DefaultHttpClient();

client.setParams(getHttpParams());

HttpGet get = new HttpGet(mUrl);

long localFileLength = getLocalFileLength();

final long remoteFileLength = getRemoteFileLength();

long downloadedLength = localFileLength;

// 远程文件不存在

if (remoteFileLength == -1l) {

Log.log("下载文件不存在...");

localFile.close();

handler.sendEmptyMessage(ERROR);

return;

}

// 本地文件存在

if (localFileLength > -1l && localFileLength 

Log.log("本地文件存在...");

localFile.seek(localFileLength);

get.addHeader("Range", "bytes=" + localFileLength + "-"

+ remoteFileLength);

}

msg = Message.obtain();

// 如果不是继续下载

if(!isGoon) {

// 发送开始下载的消息并获取文件大小的消息

msg.what = START;

msg.obj = remoteFileLength;

}else {

msg.what = GOON;

msg.obj = localFileLength;

}

handler.sendMessage(msg);

HttpResponse response = client.execute(get);

int httpCode = response.getStatusLine().getStatusCode();

if (httpCode >= 200 && httpCode <= 300) {

InputStream in = response.getEntity().getContent();

byte[] bytes = new byte[1024];

int len = -1;

while (-1 != (len = in.read(bytes))) {

localFile.write(bytes, 0, len);

downloadedLength += len;

//                  Log.log((int)(downloadedLength/(float)remoteFileLength * 100));

if ((int)(downloadedLength/(float)remoteFileLength * 100) % 10 == 0) {

// 发送更新进度的消息

msg = Message.obtain();

msg.what = PUBLISH;

msg.obj = downloadedLength;

handler.sendMessage(msg);

//                      Log.log(mDownloadId + "已下载" + downloadedLength);

}

// 暂停下载, 退出方法

if (isPause) {

// 发送暂停的消息

handler.sendEmptyMessage(PAUSE);

Log.log("下载暂停...");

break;

}

// 取消下载, 删除文件并退出方法

if (isCanceled) {

Log.log("手动关闭下载。。");

localFile.close();

client.getConnectionManager().shutdown();

new File(mLocalPath + File.separator + mFileName)

.delete();

// 发送取消下载的消息

handler.sendEmptyMessage(CANCEL);

return;

}

}

localFile.close();

client.getConnectionManager().shutdown();

// 发送下载完毕的消息

if(!isPause) handler.sendEmptyMessage(SUCCESS);

}

} catch (Exception e) {

// 发送下载错误的消息

handler.sendEmptyMessage(ERROR);

}

}

/**

* 暂停/继续下载

* param pause 是否暂停下载

* 暂停 return true

* 继续 return false

*/

public synchronized boolean pause(boolean pause) {

if(!pause) {

Log.log("继续下载");

isPause = false;

start(true); // 开始下载

}else {

Log.log("暂停下载");

isPause = true;

}

return isPause;

}

/**

* 关闭下载, 会删除文件

*/

public synchronized void cancel() {

isCanceled = true;

if(isPause) {

new File(mLocalPath + File.separator + mFileName)

.delete();

}

}

/**

* 获取本地文件大小

* @return 本地文件的大小 or 不存在返回-1

*/

public synchronized long getLocalFileLength() {

long size = -1l;

File localFile = new File(mLocalPath + File.separator + mFileName);

if (localFile.exists()) {

size = localFile.length();

}

Log.log("本地文件大小" + size);

return size <= 0 ? -1l : size;

}

/**

* 获取远程文件打下 or 不存在返回-1

* @return

*/

public synchronized long getRemoteFileLength() {

long size = -1l;

try {

DefaultHttpClient client = new DefaultHttpClient();

client.setParams(getHttpParams());

HttpGet get = new HttpGet(mUrl);

HttpResponse response = client.execute(get);

int httpCode = response.getStatusLine().getStatusCode();

if (httpCode >= 200 && httpCode <= 300) {

size = response.getEntity().getContentLength();

}

client.getConnectionManager().shutdown();

} catch (Exception e) {

e.printStackTrace();

}

Log.log("远程文件大小" + size);

return size;

}

/**

* 设置http参数 不能设置soTimeout

* @return HttpParams http参数

*/

private static HttpParams getHttpParams() {

HttpParams params = new BasicHttpParams();

HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

HttpProtocolParams.setUseExpectContinue(params, true);

HttpProtocolParams

.setUserAgent(

params,

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2041.4 Safari/537.36");

ConnManagerParams.setTimeout(params, 4000);

HttpConnectionParams.setConnectionTimeout(params, 4000);

return params;

}

/**

* 关闭下载线程池

*/

public static void closeDownloadThread() {

if(null != mThreadPool) {

mThreadPool.shutdownNow();

}

}

public interface OnDownloadListener {

public void onStart(int downloadId, long fileSize);  // 回调开始下载

public void onPublish(int downloadId, long size);    // 回调更新进度

public void onSuccess(int downloadId);               // 回调下载成功

public void onPause(int downloadId);                 // 回调暂停

public void onError(int downloadId);                 // 回调下载出错

public void onCancel(int downloadId);                // 回调取消下载

public void onGoon(int downloadId, long localSize);  // 回调继续下载

}

}

如何调用,如下:

Download d = new Download(1, "http://baidu.com/test.zip","/sdcard/download/");

d.setOnDownloadListener(new Download.OnDownloadListener() {

@Override

public void onSuccess(int downloadId) {

System.out.println(downloadId + "下载成功");

}

@Override

public void onStart(int downloadId, long fileSize) {

System.out.println(downloadId + "开始下载,文件大小:" + fileSize);

}

@Override

public void onPublish(int downloadId, long size) {

System.out.println("更新文件" + downloadId + "大小:" + size);

}

@Override

public void onPause(int downloadId) {

System.out.println("暂停下载" + downloadId);

}

@Override

public void onGoon(int downloadId, long localSize) {

System.out.println("继续下载" + downloadId);

}

@Override

public void onError(int downloadId) {

System.out.println("下载出错" + downloadId);

}

@Override

public void onCancel(int downloadId) {

System.out.println("取消下载" + downloadId);

}

});

d.start(false);

原文:http://my.oschina.net/oppo4545/blog/310099

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值