[Android] 同時運行多個AsyncTasks - 不可能?


Answers

這允許在API 4+(Android 1.6+)的所有Android版本上並行執行:

@TargetApi(Build.VERSION_CODES.HONEYCOMB) // API 11
void startMyTask(AsyncTask asyncTask) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    else
        asyncTask.execute(params);
}

這是Arhimed優秀答案的總結。

請確保您使用API​​級別11或更高作為您的項目構建目標。 在Eclipse中,即Project > Properties > Android > Project Build Target不會將後向兼容性分解為更低的API級別。 別擔心,如果您意外使用晚於minSdkVersion引入的功能,則會發生Lint錯誤。 如果您真的想使用晚於minSdkVersion引入的功能,可以使用註釋來抑制這些錯誤,但在這種情況下,您需要自己考慮兼容性。 這正是上面代碼片段中發生的情況。

Question

我試圖同時運行兩個AsyncTasks。 (平台是Android 1.5,HTC Hero。)但是,只有第一個被執行。 這裡有一個簡單的片段來描述我的問題:

public class AndroidJunk extends Activity {
 class PrinterTask extends AsyncTask<String, Void, Void> {
     protected Void doInBackground(String ... x) {
      while (true) {
       System.out.println(x[0]);
       try {
        Thread.sleep(1000);
       } catch (InterruptedException ie) {
        ie.printStackTrace();
       }
      }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        new PrinterTask().execute("bar bar bar");
        new PrinterTask().execute("foo foo foo");

        System.out.println("onCreate() is done.");
    }
}

我期望的結果是:

onCreate() is done.
bar bar bar
foo foo foo
bar bar bar
foo foo foo

等等。 但是,我得到的是:

onCreate() is done.
bar bar bar
bar bar bar
bar bar bar

第二個AsyncTask永遠不會被執行。 如果我改變了execute()語句的順序,只有foo任務會產生輸​​出。

我在這裡錯過了一些顯而易見的事情和/或做些什麼愚蠢的事情? 是不是可以同時運行兩個AsyncTasks?

編輯:我意識到有問題的手機運行Android 1.5,我更新了問題描述。 因此。 運行Android 2.1的HTC Hero沒有這個問題。 嗯...




只需在@Arhimed的完美答案中包含最新更新(更新4),即可獲得@sulai的精彩摘要:

void doTheTask(AsyncTask task) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // Android 4.4 (API 19) and above
        // Parallel AsyncTasks are possible, with the thread-pool size dependent on device
        // hardware
        task.execute(params);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // Android 3.0 to
        // Android 4.3
        // Parallel AsyncTasks are not possible unless using executeOnExecutor
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    } else { // Below Android 3.0
        // Parallel AsyncTasks are possible, with fixed thread-pool size
        task.execute(params);
    }
}