9

我正在开发一个需要同时下载多个文件的应用程序。我正在为每个文件创建一个AsyncTask自己HttpClient的文件,但下一个文件只有在前一个文件完成后才开始下载。

可能是服务器端的问题?

4

3 回答 3

20

这是因为 Honeycomb 中的 AsyncTask 管理发生了变化。以前,如果您启动 3 个 AsyncTasks,它们会同时运行。由于 HC,如果您targetSdk的设置为12或更高,这些将排队并一一执行(请参阅此讨论)。要解决这个问题,请以这种方式启动 AsyncTasks:

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);

代替:

task.execute(params);

如果您还针对较旧的 Android,则需要条件代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
} else {
   task.execute(params);
}

或将其包装在一个单独的辅助类中:

public class Utils {

    public static <P, T extends AsyncTask<P, ?, ?>> void executeAsyncTask(T task) {
        executeAsyncTask(task, (P[]) null);
    }

    @SuppressLint("NewApi")
    public static <P, T extends AsyncTask<P, ?, ?>> void executeAsyncTask(T task, P... params) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
        } else {
            task.execute(params);
        }
    }
 }

和用法将是即:

Utils.executeAsyncTask( new MyAsyncTask() );
于 2012-11-19T17:58:25.873 回答
1

首次引入时,AsyncTask 在单个后台线程上串行执行。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。资源

因此,根据版本,AsyncTask 不会并行执行。对于文件下载等任务,您应该使用Executor使用线程池

或者你可以使用executeOnExecutor方法..

于 2012-11-19T17:58:03.650 回答
0

您似乎在您的应用程序中共享一个 HttpClient 实例,并为您的 AsyncTasks 提供自己的方法。顺便说一句,我完全知道该链接适用于旧版本,但该文档似乎没有针对 4.x 进行更新。

于 2012-11-19T17:57:52.753 回答