1

在我的应用程序中,我需要下载一堆文件。我最初的计划是为每个文件使用一个单独的 AsyncTask,以便在下载每个文件时通知应用程序的其余部分。我发现它测试虽然这有效,但它似乎真的内存效率低下。有没有一种使用单个 AsyncTask 或服务来下载文件并通知每个文件完成的好方法?

4

3 回答 3

1

没有理由使用多个AsyncTasks,因为您可以创建文件名列表,将其传递给单个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 回答