使用downloadTogether这个方法批量下载文件
FileDownloadQueueSet downloadTogether(List
mQueueSet.downloadTogether(tasks);
每下载完成一个task,就会回调FileDownloadListener的completed方法,表示一个下载任务完成。
那么当下载任务tasks全部下载完成,有没有提供一个回调方法表示所有的下载任务完成啦?
或者说我怎么知道下载任务全部完成。
求大神告知,谢谢!
你可以用集合保存所有子任务的id,在completed方法中判断是否为最后一个子任务,同时也可以计算总进度。hope this help you.
@congwiny 参考这里: #https://github.com/lingochamp/FileDownloader/issues/186#issuecomment-226989361
@HarkBen @Jacksgong 谢谢。。
我是这么写的,应该没啥问题吧。是否还有可优化的地方。
```java
import com.liulishuo.filedownloader.BaseDownloadTask;
import com.liulishuo.filedownloader.FileDownloadListener;
import com.liulishuo.filedownloader.FileDownloadQueueSet;
import com.liulishuo.filedownloader.FileDownloader;
import java.util.List;
public class FileDownloadHelper {
private static final String TAG = FileDownloadHelper.class.getSimpleName();
private static FileDownloadHelper mHelper;
private OnDownloadListener mListener;
private FileDownloadListener mDownloadListener;
private FileDownloadQueueSet mQueueSet;
//下载任务完成的个数
private int mFinishCount;
//所有的下载个数
private int mAllCount;
private FileDownloadHelper() {
}
public static FileDownloadHelper getInstance() {
if (mHelper == null) {
synchronized (FileDownloadHelper.class) {
if (mHelper == null) {
mHelper = new FileDownloadHelper();
}
}
}
return mHelper;
}
private void initDownloadListener() {
mDownloadListener = new FileDownloadListener() {
@Override
protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
// 之所以加这句判断,是因为有些异步任务在pause以后,会持续回调pause回来,而有些任务在pause之前已经完成,
// 但是通知消息还在线程池中还未回调回来,这里可以优化
// 后面所有在回调中加这句都是这个原因
if (task.getListener() != mDownloadListener) {
return;
}
}
@Override
protected void connected(BaseDownloadTask task, String etag, boolean isContinue,
int soFarBytes, int totalBytes) {
super.connected(task, etag, isContinue, soFarBytes, totalBytes);
if (task.getListener() != mDownloadListener) {
return;
}
}
@Override
protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
if (task.getListener() != mDownloadListener) {
return;
}
if (mListener != null) {
mListener.onDownloadProgress(task, soFarBytes, totalBytes);
}
}
@Override
protected void blockComplete(BaseDownloadTask task) {
if (task.getListener() != mDownloadListener) {
return;
}
}
@Override
protected void retry(BaseDownloadTask task, Throwable ex, int retryingTimes, int soFarBytes) {
super.retry(task, ex, retryingTimes, soFarBytes);
if (task.getListener() != mDownloadListener) {
return;
}
}
@Override
protected void completed(BaseDownloadTask task) {
if (task.getListener() != mDownloadListener) {
return;
}
if (mListener != null) {
mListener.onDownloadComplete(task);
}
}
@Override
protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
if (task.getListener() != mDownloadListener) {
return;
}
}
@Override
protected void error(BaseDownloadTask task, Throwable e) {
if (task.getListener() != mDownloadListener) {
return;
}
if (mListener != null) {
mListener.onDownloadTaskError(task, e);
}
}
@Override
protected void warn(BaseDownloadTask task) {
if (task.getListener() != mDownloadListener) {
return;
}
}
};
}
private void initQueueSet() {
mQueueSet = new FileDownloadQueueSet(mDownloadListener);
mQueueSet.disableCallbackProgressTimes();
//重试10次
mQueueSet.setAutoRetryTimes(10);
mQueueSet.addTaskFinishListener(new BaseDownloadTask.FinishListener() {
@Override
public void over(BaseDownloadTask task) {
if (++mFinishCount >= mAllCount) {
if (mListener != null) {
mListener.onDownloadTaskOver();
}
}
}
});
}
/**
* 自定义一些设置的downloadQueueSet
*
* @param fileDownloadQueueSet
*/
public void setFileDownloadQueueSet(FileDownloadQueueSet fileDownloadQueueSet) {
mQueueSet = fileDownloadQueueSet;
}
public void downloadTogether(List<BaseDownloadTask> tasks) {
//暂停之前的下载任务
if (mDownloadListener != null) {
FileDownloader.getImpl().pause(mDownloadListener);
}
initDownloadListener();
initQueueSet();
mFinishCount = 0;
mAllCount = tasks.size();
mQueueSet.downloadTogether(tasks);
mQueueSet.start();
}
//暂停所有的下载任务
public void pauseAllDownload() {
FileDownloader.getImpl().pauseAll();
}
public void downloadSequentially(List<BaseDownloadTask> tasks) {
if (mDownloadListener != null) {
FileDownloader.getImpl().pause(mDownloadListener);
}
initDownloadListener();
initQueueSet();
mFinishCount = 0;
mAllCount = tasks.size();
mQueueSet.downloadSequentially(tasks);
mQueueSet.start();
}
public void setOnDownloadListener(OnDownloadListener listener) {
mListener = listener;
}
public interface OnDownloadListener {
//在下载线程
void onDownloadComplete(BaseDownloadTask task);
void onDownloadTaskError(BaseDownloadTask task, Throwable e);
void onDownloadProgress(BaseDownloadTask task, int soFarBytes, int totalBytes);
//所有下载任务完成
void onDownloadTaskOver();
}
}
@HarkBen @Jacksgong
后来优化了下
```java
public class FileDownloadHelper {
private static final String TAG = FileDownloadHelper.class.getSimpleName();
private static FileDownloadHelper mHelper;
private OnDownloadListener mListener;
private FileDownloadListener mDownloadListener;
private FileDownloadQueueSet mQueueSet;
private List<BaseDownloadTask> mAllDownloadTasks;
private FileDownloadHelper() {
mAllDownloadTasks = Collections.synchronizedList(new LinkedList<BaseDownloadTask>());
}
public static FileDownloadHelper getInstance() {
if (mHelper == null) {
synchronized (FileDownloadHelper.class) {
if (mHelper == null) {
mHelper = new FileDownloadHelper();
}
}
}
return mHelper;
}
private void initDownloadListener() {
mDownloadListener = new FileDownloadListener() {
@Override
protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
// 之所以加这句判断,是因为有些异步任务在pause以后,会持续回调pause回来,而有些任务在pause之前已经完成,
// 但是通知消息还在线程池中还未回调回来,这里可以优化
// 后面所有在回调中加这句都是这个原因
if (task.getListener() != mDownloadListener) {
return;
}
}
@Override
protected void connected(BaseDownloadTask task, String etag, boolean isContinue,
int soFarBytes, int totalBytes) {
super.connected(task, etag, isContinue, soFarBytes, totalBytes);
if (task.getListener() != mDownloadListener) {
return;
}
}
@Override
protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
if (task.getListener() != mDownloadListener) {
return;
}
if (mListener != null) {
mListener.onDownloadProgress(task, soFarBytes, totalBytes);
}
}
@Override
protected void blockComplete(BaseDownloadTask task) {
if (task.getListener() != mDownloadListener) {
return;
}
}
@Override
protected void retry(BaseDownloadTask task, Throwable ex, int retryingTimes, int soFarBytes) {
super.retry(task, ex, retryingTimes, soFarBytes);
if (task.getListener() != mDownloadListener) {
return;
}
}
@Override
protected void completed(BaseDownloadTask task) {
if (task.getListener() != mDownloadListener) {
return;
}
if (mListener != null) {
mListener.onDownloadComplete(task);
}
}
@Override
protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
if (task.getListener() != mDownloadListener) {
return;
}
}
@Override
protected void error(BaseDownloadTask task, Throwable e) {
if (task.getListener() != mDownloadListener) {
return;
}
if (mListener != null) {
mListener.onDownloadTaskError(task, e);
}
}
@Override
protected void warn(BaseDownloadTask task) {
if (task.getListener() != mDownloadListener) {
return;
}
}
};
}
private void initQueueSet() {
mQueueSet = new FileDownloadQueueSet(mDownloadListener);
mQueueSet.disableCallbackProgressTimes();
//重试10次
mQueueSet.setAutoRetryTimes(10);
mQueueSet.addTaskFinishListener(new BaseDownloadTask.FinishListener() {
@Override
public void over(BaseDownloadTask task) {
mAllDownloadTasks.remove(task);
if (mAllDownloadTasks.isEmpty()) {
if (mListener != null) {
mListener.onDownloadTaskOver();
}
}
}
});
}
/**
* 自定义一些设置的downloadQueueSet
*
* @param fileDownloadQueueSet
*/
public void setFileDownloadQueueSet(FileDownloadQueueSet fileDownloadQueueSet) {
mQueueSet = fileDownloadQueueSet;
}
public void downloadTogether(List<BaseDownloadTask> tasks) {
//暂停之前的下载任务
if (mDownloadListener != null) {
FileDownloader.getImpl().pause(mDownloadListener);
}
initDownloadListener();
initQueueSet();
mAllDownloadTasks.addAll(tasks);
mQueueSet.downloadTogether(mAllDownloadTasks);
mQueueSet.start();
}
//暂停所有的下载任务
public void pauseAllDownload() {
FileDownloader.getImpl().pauseAll();
}
public void downloadSequentially(List<BaseDownloadTask> tasks) {
if (mDownloadListener != null) {
FileDownloader.getImpl().pause(mDownloadListener);
}
initDownloadListener();
initQueueSet();
mAllDownloadTasks.addAll(tasks);
mQueueSet.downloadSequentially(mAllDownloadTasks);
mQueueSet.start();
}
public void downloadSequentially(BaseDownloadTask task) {
if (mDownloadListener != null) {
FileDownloader.getImpl().pause(mDownloadListener);
}
initDownloadListener();
initQueueSet();
mAllDownloadTasks.add(0, task);
mQueueSet.downloadSequentially(mAllDownloadTasks);
mQueueSet.start();
}
public void setOnDownloadListener(OnDownloadListener listener) {
mListener = listener;
}
public interface OnDownloadListener {
//在下载线程
void onDownloadComplete(BaseDownloadTask task);
void onDownloadTaskError(BaseDownloadTask task, Throwable e);
void onDownloadProgress(BaseDownloadTask task, int soFarBytes, int totalBytes);
//所有下载任务完成
void onDownloadTaskOver();
}
}
Most helpful comment
你可以用集合保存所有子任务的id,在completed方法中判断是否为最后一个子任务,同时也可以计算总进度。hope this help you.