您的位置:首页 > 其它

基于XUtil工具的多个文件下载显示总进度

2016-11-13 13:54 477 查看
项目开发中遇到这么一个问题,ListView的一个Item中显示多个文件,需要网络下载时,显示该Item中所有文件的一个总的下载进度,

比如item中有,file1、file2、file3、file4,其中file2为.mp4文件,其余为.jpg文件,下载之前不知道各个文件的大小,只有当XUtil的onLoading时,才能知道这个文件的总大小。

本文采用一中比较传统的方式实现,首先是一个文件类 FileModel    两个属性,fileName与filePath,另一个是下载进度类DownloadProgress,属性为下载量,缓存值,当前值,上一个文件下载完成时的值,总进度值,以及下载进度(百分比)。具体类参看代码:

public class FileModel {

private String fileName = "";
private String filePath = "";

public FileModel() {

}

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public String getFilePath() {
return filePath;
}

public void setFilePath(String filePath) {
this.filePath = filePath;
}
}

public class DownloadProgress {

public long current = 0;
public long total = 0;
public long temp = 0;
public long last = 0;
public int result = 0;

public DownloadProgress() {
this.current = 0;
this.result = 0;
this.total = 0;
this.last = 0;
this.temp = 0;
}

public long getCurrent() {
return current;
}

public void setCurrent(long current) {
this.current = current;
}

public long getTotal() {
return total;
}

public void setTotal(long total) {
this.total = total;
}

public long getTemp() {
return temp;
}

public void setTemp(long temp) {
this.temp = temp;
}

public long getLast() {
return last;
}

public void setLast(long last) {
this.last = last;
}

public int getResult() {
return result;
}

public void setResult(int result) {
this.result = result;
}

}


下载时改选中的item中的List<FileModel> list,多个选中,则多次调用改函数接口。

public void download(List<FileModel> fileList) {

DownloadProgress progress = new DownloadProgress();     //每个需要下载的Item实例化不同的进度监看对象
int size = fileList.size();
if (size > 0) {
for (int i = 0; i < size; i++) {
String localPath = LOCAL_PATH + fileList.get(i).getFileName(); //下载文件的本地存放路径
downloadFile(fileList.get(i).getFilePath(), localPath, progress);
}
}
}

public void downloadFile(final String filePath, String localPath, final DownloadProgress progress) {
HttpUtils http = new HttpUtils();
http.configRequestThreadPoolSize(5);        //同时下载文件为5个
http.download(filePath, localPath, true, true, new RequestCallBack<File>() {
@Override
public void onStart() {
Log.d(TAG, "start download file: " + filePath);
}

@Override
public void onLoading(long total, long current, boolean isUploading) {
// 显示进度条  百分之几

int result = (int) ((double) current / (double) total * 100);
Log.d(TAG, "single file result=" + current + "/" + total + " = " + result + " % ");

//文件一开始下载,设置这个文件的总值,并累计到progress中
if ((progress.temp != total) && (current == 0)) {
progress.temp = total;
progress.total += total;
}

//某个文件下载文成时,记录该文件总下载量
if (result == 100) {
progress.last += total;
progress.current = progress.last;
} else {
progress.current = progress.last + current;     //未下载完成时,当前进度值为上一次的值加上当前值
}

double tempResult = (double) (progress.current) / (double) (progress.total);  //总进度
progress.result = (int) (tempResult * 100);
Log.d(TAG, "model result=: " + progress.current + "/" + progress.total + " = " + progress.result + "%");

}

@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
// TODO:下载完成
}

@Override
public void onFailure(HttpException error, String msg) {
// TODO: 下载失败
}
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息