使用多个AsyncTasks同时进行HttpClient请求

时间:2012-11-19 17:53:40

标签: android multithreading http download httpclient

我正在开发一个需要同时下载多个文件的应用。我正在为每个文件创建一个AsyncTaskHttpClient,但下一个文件只在上一个文件完成后才开始下载。

这可能是服务器端问题吗?

3 个答案:

答案 0 :(得分:20)

这是因为Honeycomb中的AsyncTask管理发生了变化。以前,如果您启动了3个AsyncTasks,它们会同时运行。自HC以来,如果targetSdk设置为12或更高,则会将这些列表排队并逐个执行(请参阅this discussion)。要以这种方式开始你的AsyncTasks:

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);

而不是:

task.execute(params);

如果您还定位旧的Androids,则需要条件代码:

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() );

答案 1 :(得分:1)

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

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

来使用线程池

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

答案 2 :(得分:0)

您似乎share an instance of HttpClient across your application并为您的AsyncTasks提供了自己的方法。顺便说一句,我完全知道该链接适用于旧版本,但该文档似乎没有针对4.x更新。