【问题标题】:MultiDownloading with AsyncTask [closed]使用 AsyncTask 进行多重下载 [关闭]
【发布时间】:2013-07-19 09:55:55
【问题描述】:

我想使用 AsyncTask 同时(同时)下载所有文件。

我想知道如何同时下载多个文件。我试图在互联网上搜索但一无所获,但发现在很多应用程序中都可以做到这一点。

我还想提高我的应用程序 (android) 的稳定性,以便每次执行或刷新 UI 时都不会减慢进程 ---> “滞后”。

对不起,我的英语不太好。非常感谢。

【问题讨论】:

  • 使用executorOnExecutor。用于并行执行task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "http://url.com/image.png")
  • 你应该看看这个训练练习(它是用图像完成的,所以你必须根据一般文件对其进行调整,但会为你指明正确的方向):developer.android.com/training/displaying-bitmaps/index.html
  • 你能举个例子吗? 2个同时下载

标签: android performance asynchronous android-asynctask lag


【解决方案1】:

像这样创建你的下载任务:

public class NewspaperDownloader extends AsyncTask<Void, Void, File> {

    URL urlToDownload;

    public DownloaderTask(URL urlToDownload) {
        this.urlToDownload = urlToDownload;
    }

    protected void onPreExecute() {
        // prepare your download here
    }

    protected String doInBackground(Void... params) {
        // do your download here
        [...]
    }

    protected void onPostExecute(File downloadedFile) {
        // Do something with the download
    }
}

如果您不知道如何在 Android 上的 AsyncTask 中下载文件,请查看我提供的示例 here

最后像这样调用你的下载:

// Task 1
DownloadTask task1 = new DownloadTask(urlToDownload);
task1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
// Task 2
DownloadTask task2 = new DownloadTask(urlToDownload);
task2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
// Task 3
DownloadTask task3 = new DownloadTask(urlToDownload);
task3.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

更新

从列表下载网址:

List<URL> urls = new ArrayList<URL>();
urls.add(...);
[...]
for(URL url : urls) {
    DownloadTask task = new DownloadTask(url);
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

【讨论】:

  • 如果我不知道我想同时运行多少次下载?
  • 查看我的更新,例如如果您使用要下载的url列表并且数量未知,只需为列表中的每个url创建一个任务。
  • 请记住,同时运行的 AsyncTask 的数量不是无限的,因此如果系统定义的最大池大小线程的数量已经在运行,则新任务将排队等待正在运行的任务完成.
  • 你有我的例子吗?我不太擅长驾驭
  • 我解决了,但我有问题
【解决方案2】:

请注意,使用AsyncTask 可能无法为您提供所需的真正并行性。关键是在不同版本的 Android 中,可以同时运行的AsyncTasks 的数量已经从 1 变为 5,如果我没记错的话,再回到 1。在这里检查:

https://github.com/android/platform_frameworks_base/commits/master/core/java/android/os/AsyncTask.java

这里:

https://groups.google.com/forum/?fromgroups#!topic/android-developers/8M0RTFfO7-M

此外,AsyncTasks 可能会被杀死,甚至可能无法运行。这是因为AsyncTasks 由您无法控制的ThreadPool 支持。如果AsyncTask 不能满足您的需求,最好的解决方案是使用ServicesLoopers 或构建您自己的ThreadPoolExecutor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多