我有2个ASyncTasks,一个用于从httpPost检索值,另一个用于更新UI的某些元素(包括列表 View )。
问题在于,由于两个ASyncTasks共享同一个后台线程,因此如果网络运行首先启动并且运行缓慢(由于网络连接不良)。其他后台线程花费太多时间,使应用程序不负责任。

由于两个ASyncTasks都是独立的,所以让另一个等待很愚蠢。不同的类使用不同的线程会更具逻辑性,这是我错了吗?

阅读ASyncTask文档。谈论使用 executeOnExecutor(),但是如何在低于11的API级别解决该问题?

这里有一个小例子,再现了“问题”

        new Task1().execute();
        new Task2().execute();


public class Task1 extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        GLog.e("doInBackground start 1");
        SystemClock.sleep(9000);
        GLog.e("doInBackground end 1");
        return null;
    }

    @Override
    protected void onPreExecute() {
        GLog.e("onPreExecute 1");
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Void result) {
        GLog.e("onPostExecute 1");
        super.onPostExecute(result);
    }

}

public class Task2 extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        GLog.e("onPreExecute 2");
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        GLog.e("doInBackground start 2");
        SystemClock.sleep(9000);
        GLog.e("doInBackground end 2");
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        GLog.e("onPostExecute 2");
        super.onPostExecute(result);
    }

}

最佳答案

这是我在代码中处理此问题的方式:

if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
    new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    new MyAsyncTask().execute();
}

并分别用您的MyAsyncTaskTask1替换Task2。基本上,AsyncTask中的更改出现在Honeycomb中(请参见“执行顺序”部分中的Android SDK文档here),因此在此之前,请像往常一样启动它,对于HC及更高版本,如果您不喜欢新行为(请不要这样做,请使用executeOnExecutor(),我认为)

08-17 18:26