Xutils是一款非常优秀的开源框架,现在我的项目都是在这个框架上再次封装开发项目的。
使用必须申请两个权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Xutils 一共四个模块 : ViewUtils、HttpUtils、DbUtils、BitmapUtil
详细内容:https://github.com/wyouflf/xUtils
我看有个download模块没有在Github上提到,在这我说一下我的理解:
Demo中提供了三个类:DownloadInfo,DownloadService,DownloadManage
第一个类:DownloadInfo.class
是每一个下载对象的信息,其中记录了文件保存路径和文件下载进度等信息,当然这是用数据库存储下来的。
第二个类:DownloadService.class
看名字就知道,这是一个后台Service,所有的下载任务都在这里面,所以不用担心页面销毁,下载进度问题。
第三个类:DownloadManage.class
这是下载管理类,下载操作都在这里面,还有下载进度。
package com.example.appstoredemo.down;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import com.lidroid.xutils.DbUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.db.converter.ColumnConverter;
import com.lidroid.xutils.db.converter.ColumnConverterFactory;
import com.lidroid.xutils.db.sqlite.ColumnDbType;
import com.lidroid.xutils.db.sqlite.Selector;
import com.lidroid.xutils.exception.DbException;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.HttpHandler;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.util.LogUtils;
/**
* Author: wyouflf Date: 13-11-10 Time: 下午8:10
*/
public class DownloadManager {
private List<DownloadInfo> downloadInfoList;
private int maxDownloadThread = 3;
private Context mContext;
private DbUtils db;
/* package 每次new一个对象都会从数据库中读取一遍 */DownloadManager(Context appContext) {
ColumnConverterFactory.registerColumnConverter(HttpHandler.State.class, new HttpHandlerStateConverter());
mContext = appContext;
db = DbUtils.create(mContext);
try {
downloadInfoList = db.findAll(Selector.from(DownloadInfo.class));
} catch (DbException e) {
LogUtils.e(e.getMessage(), e);
}
if (downloadInfoList == null) {
downloadInfoList = new ArrayList<DownloadInfo>();
}
}
public int getDownloadInfoListCount() {
return downloadInfoList.size();
}
public DownloadInfo getDownloadInfo(int index) {
return downloadInfoList.get(index);
}
public DownloadInfo getDownloadInfoByDB(String downloadUrl) throws DbException {
DownloadInfo downloadInfo = db.findFirst(Selector.from(DownloadInfo.class).where("downloadUrl", "=", downloadUrl));
return downloadInfo;
}
public DownloadInfo getDownloadInfoByList(String downloadUrl) {
for (int i = 0; i < downloadInfoList.size(); i++) {
if (downloadUrl.equals(downloadInfoList.get(i).getDownloadUrl())) {
return downloadInfoList.get(i);
}
}
return null;
}
//添加一个新的下载任务
public void addNewDownload(String url, String fileName, String target, boolean autoResume, boolean autoRename, String pkg, String icon, String appId, final RequestCallBack<File> callback) throws DbException {
final DownloadInfo downloadInfo = new DownloadInfo();
downloadInfo.setDownloadUrl(url);
downloadInfo.setAutoRename(autoRename);
downloadInfo.setAutoResume(autoResume);
downloadInfo.setFileName(fileName);
downloadInfo.setFileSavePath(target);
downloadInfo.setPkg(pkg);
downloadInfo.setIcon(icon);
downloadInfo.setAppId(appId);
HttpUtils http = new HttpUtils();
http.configRequestThreadPoolSize(maxDownloadThread);
HttpHandler<File> handler = http.download(url, target, autoResume, autoRename, new ManagerCallBack(downloadInfo, callback));
downloadInfo.setHandler(handler);
downloadInfo.setState(handler.getState());
downloadInfoList.add(downloadInfo);
db.saveBindingId(downloadInfo);
}
public void resumeDownload(int index, final RequestCallBack<File> callback) throws DbException {
final DownloadInfo downloadInfo = downloadInfoList.get(index);
resumeDownload(downloadInfo, callback);
}
public void resumeDownload(DownloadInfo downloadInfo, final RequestCallBack<File> callback) throws DbException {
HttpUtils http = new HttpUtils();
http.configRequestThreadPoolSize(maxDownloadThread);
HttpHandler<File> handler = http.download(downloadInfo.getDownloadUrl(), downloadInfo.getFileSavePath(), downloadInfo.isAutoResume(), downloadInfo.isAutoRename(), new ManagerCallBack(downloadInfo, callback));
downloadInfo.setHandler(handler);
downloadInfo.setState(handler.getState());
db.saveOrUpdate(downloadInfo);
}
public void removeDownload(int index) throws DbException {
DownloadInfo downloadInfo = downloadInfoList.get(index);
removeDownload(downloadInfo);
}
public void removeDownload(DownloadInfo downloadInfo) throws DbException {
HttpHandler<File> handler = downloadInfo.getHandler();
if (handler != null && !handler.isCancelled()) {
handler.cancel();
}
downloadInfoList.remove(downloadInfo);
db.delete(downloadInfo);
}
public void stopDownload(int index) throws DbException {
DownloadInfo downloadInfo = downloadInfoList.get(index);
stopDownload(downloadInfo);
}
public void stopDownload(DownloadInfo downloadInfo) throws DbException {
HttpHandler<File> handler = downloadInfo.getHandler();
if (handler != null && !handler.isCancelled()) {
handler.cancel();
} else {
downloadInfo.setState(HttpHandler.State.CANCELLED);
}
db.saveOrUpdate(downloadInfo);
}
public void stopAllDownload() throws DbException {
for (DownloadInfo downloadInfo : downloadInfoList) {
HttpHandler<File> handler = downloadInfo.getHandler();
if (handler != null && !handler.isCancelled()) {
handler.cancel();
} else {
downloadInfo.setState(HttpHandler.State.CANCELLED);
}
}
db.saveOrUpdateAll(downloadInfoList);
}
public void backupDownloadInfoList() throws DbException {
for (DownloadInfo downloadInfo : downloadInfoList) {
HttpHandler<File> handler = downloadInfo.getHandler();
if (handler != null) {
downloadInfo.setState(handler.getState());
}
}
db.saveOrUpdateAll(downloadInfoList);
}
public int getMaxDownloadThread() {
return maxDownloadThread;
}
public void setMaxDownloadThread(int maxDownloadThread) {
this.maxDownloadThread = maxDownloadThread;
}
//下载进度监听
public class ManagerCallBack extends RequestCallBack<File> {
private DownloadInfo downloadInfo;
private RequestCallBack<File> baseCallBack;
public RequestCallBack<File> getBaseCallBack() {
return baseCallBack;
}
public void setBaseCallBack(RequestCallBack<File> baseCallBack) {
this.baseCallBack = baseCallBack;
}
private ManagerCallBack(DownloadInfo downloadInfo, RequestCallBack<File> baseCallBack) {
this.baseCallBack = baseCallBack;
this.downloadInfo = downloadInfo;
}
//取得保存的对象,在ListView中会用的到
@Override
public Object getUserTag() {
if (baseCallBack == null)
return null;
return baseCallBack.getUserTag();
}
//保存一个对象
@Override
public void setUserTag(Object userTag) {
if (baseCallBack == null)
return;
baseCallBack.setUserTag(userTag);
}
@Override
public void onStart() {
HttpHandler<File> handler = downloadInfo.getHandler();
if (handler != null) {
downloadInfo.setState(handler.getState());
}
try {
db.saveOrUpdate(downloadInfo);
} catch (DbException e) {
LogUtils.e(e.getMessage(), e);
}
if (baseCallBack != null) {
baseCallBack.onStart();
}
}
@Override
public void onCancelled() {
HttpHandler<File> handler = downloadInfo.getHandler();
if (handler != null) {
downloadInfo.setState(handler.getState());
}
try {
db.saveOrUpdate(downloadInfo);
} catch (DbException e) {
LogUtils.e(e.getMessage(), e);
}
if (baseCallBack != null) {
baseCallBack.onCancelled();
}
}
@Override
public void onLoading(long total, long current, boolean isUploading) {
HttpHandler<File> handler = downloadInfo.getHandler();
if (handler != null) {
downloadInfo.setState(handler.getState());
}
downloadInfo.setFileLength(total);
downloadInfo.setProgress(current);
try {
db.saveOrUpdate(downloadInfo);
} catch (DbException e) {
LogUtils.e(e.getMessage(), e);
}
if (baseCallBack != null) {
baseCallBack.onLoading(total, current, isUploading);
}
}
@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
HttpHandler<File> handler = downloadInfo.getHandler();
if (handler != null) {
downloadInfo.setState(handler.getState());
}
try {
db.saveOrUpdate(downloadInfo);
} catch (DbException e) {
LogUtils.e(e.getMessage(), e);
}
if (baseCallBack != null) {
baseCallBack.onSuccess(responseInfo);
}
}
@Override
public void onFailure(HttpException error, String msg) {
HttpHandler<File> handler = downloadInfo.getHandler();
if (handler != null) {
downloadInfo.setState(handler.getState());
}
try {
db.saveOrUpdate(downloadInfo);
} catch (DbException e) {
LogUtils.e(e.getMessage(), e);
}
if (baseCallBack != null) {
baseCallBack.onFailure(error, msg);
}
}
}
private class HttpHandlerStateConverter implements ColumnConverter<HttpHandler.State> {
@Override
public HttpHandler.State getFieldValue(Cursor cursor, int index) {
return HttpHandler.State.valueOf(cursor.getInt(index));
}
@Override
public HttpHandler.State getFieldValue(String fieldStringValue) {
if (fieldStringValue == null)
return null;
return HttpHandler.State.valueOf(fieldStringValue);
}
@Override
public Object fieldValue2ColumnValue(HttpHandler.State fieldValue) {
return fieldValue.value();
}
@Override
public ColumnDbType getColumnDbType() {
return ColumnDbType.INTEGER;
}
}
}