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

Joã*_* G. 9 multithreading android http download httpclient

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

可能是服务器端问题?

Mar*_*ski 20

这是因为Honeycomb中的AsyncTask管理发生了变化.以前,如果您启动了3个AsyncTasks,它们会同时运行.从HC开始,如果你targetSdk设置为12或更高,这些是排队并逐个执行(参见本讨论).要通过这种方式开始使用AsyncTasks:

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
Run Code Online (Sandbox Code Playgroud)

代替:

task.execute(params);
Run Code Online (Sandbox Code Playgroud)

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

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

或将其包装在单独的帮助器类中:

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);
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

用法是:

Utils.executeAsyncTask( new MyAsyncTask() );
Run Code Online (Sandbox Code Playgroud)