在我的应用程序中,我需要下载一堆文件。我最初的计划是为每个文件使用一个单独的 AsyncTask,以便在下载每个文件时通知应用程序的其余部分。我发现它测试虽然这有效,但它似乎真的内存效率低下。有没有一种使用单个 AsyncTask 或服务来下载文件并通知每个文件完成的好方法?
问问题
760 次
3 回答
1
没有理由使用多个AsyncTask
s,因为您可以创建文件名列表,将其传递给单个AsyncTask
,并在每个文件下载后,使用publishProgress()
和发布下载进度onProgressUpdate()
,它在 UI 线程中运行,可以轻松通知其他活动在您的应用程序中。
private class DownloadFilesTask extends AsyncTask<URL, String, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
for (int i = 0; i < count; i++) {
Downloader.downloadFile(urls[i]);
publishProgress(urls[i].toString());
}
return 0;
}
protected void onProgressUpdate(String... progress) {
// notify whomever you like with url from progress[0]
// this is run on UI thread
}
protected void onPostExecute(Long result) {
// do something else
// this is also run on UI thread
}
}
于 2012-05-19T02:28:44.607 回答
0
远程服务可以工作,但我认为这是错误的方法,因为您的功能有限。
我会使用 AsyncTask,但要通过方法调用它。
当您在 AsyncTask 中完成后,再次调用该方法,该方法将在删除列表中的项目或更新某些计数器后创建一个新的 AsyncTask。
请记住,AsyncTask 不能重复使用,因此每次都需要重新创建它。
于 2012-05-19T01:08:55.543 回答
0
从内存和网络的角度来看,您最好只使用一个 AsyncTask(或 Java 线程)并一一下载所有文件。这大大提高了设备的响应能力,同时也消耗了一点内存。如果您可以控制服务器端,我还建议您将较小的文件压缩到一个存档中(我的项目还通过 HTTP 下载大量文件),如果将文件合并到大小约为 2- 的存档中,速度会大大提高4 MB 并下载。如果您仅使用 TCP/IP 连接进行下载,那么如果您不每次都重新建立连接,那么文件有多大都无关紧要。但是对于 HTTP 来说,最大的时间浪费通常是建立连接。
于 2012-05-19T01:13:49.483 回答