如何用队列管理AsyncTask

 我来答
百度网友0d685c6
2016-05-27 · 知道合伙人数码行家
百度网友0d685c6
知道合伙人数码行家
采纳数:3348 获赞数:6283
毕业于中北大学测控技术与仪器专业,本科学位。从事编程3年,擅长电脑的问题,LTE的问题。

向TA提问 私信TA
展开全部
我最近在写一个Android文件下载的模块,具体的实现是这样的。
当用户选择多个文件或着文件夹后,获取到选择的文件路径,并放到一个数组中。使用循环遍历这个数组,为数组中的每一个文件创建一个AsyncTask实例(为每个文件开辟一个新线程),并执行它的execute方法。
为了测试这个模块,我下载了20张图片,每张图片1兆左右,结果图片可以稳定地下载(只不过UI更新进度有问题,有的文件已经下载完毕却还显示的是下载到了百分之多少)。
问题是,假如下载的不是20张图片,而是2000张图片的话,按照上面的做法,它会开启2000个线程。虽然Android SDK默认只执行前五个线程,其余线程处于等待。但是2000个AsyncTask实例已经调用了execute方法,系统已经分配了资源,所以我担心这样会拖慢系统性能,甚至内存溢出。
既然这样设计是有缺陷的,为了避免这个问题,那么我想使用队列来管理这2000个AsyncTask实例,先拿出前5个执行,待执行完毕后,队列中的等待的实例再出列并调用它的execute方法。我对AsyncTask不熟悉,不知道这样想对不对呢?还望前辈们多多指点。
method for add download task
?

1
2
3
4
5
6
7
8
9
10
11
12
13

/**
* Add a new download task
*/
public int addDownloadTask(Account account,
String repoName,
String repoID,
String path) {
// omit lines...
DownloadTask task = new DownloadTask(account, repoName, repoID, path);
// execute download task serially
task.execute();
return task.getTaskID();
}

call addDownloadTask in a loop

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

for (SeafDirent seafDirent : dirents) {
if (!seafDirent.isDir()) {
File localCachedFile = dataManager.
getLocalCachedFile(repoName,
repoID,
seafDirent.name),
seafDirent.id);
if (localCachedFile == null) {
txService.addDownloadTask(account,
repoName,
repoID,
Utils.pathJoin(filePath,
seafDirent.name));
}
}
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式