如何用队列管理AsyncTask
1个回答
2016-05-27 · 知道合伙人数码行家
关注
展开全部
我最近在写一个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));
}
}
}
当用户选择多个文件或着文件夹后,获取到选择的文件路径,并放到一个数组中。使用循环遍历这个数组,为数组中的每一个文件创建一个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));
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询