Đó là vì quản lý AsyncTask thay đổi trong Honeycomb. Trước đây nếu bạn bắt đầu, tức là 3 AsyncTask, chúng đã chạy đồng thời. Vì HC, nếu targetSdk
của bạn được đặt thành 12
hoặc cao hơn, chúng được xếp hàng đợi và thực hiện từng cái một (xem this discussion). Để làm việc đó xung quanh bắt đầu AsyncTasks bạn theo cách đó:
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
thay vì:
task.execute(params);
Nếu bạn cũng nhắm mục tiêu Androids cũ hơn, bạn cần có mã điều kiện:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
} else {
task.execute(params);
}
hoặc bọc nó trong một lớp trợ giúp riêng biệt:
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);
}
}
}
và cách sử dụng sẽ là:
Utils.executeAsyncTask(new MyAsyncTask());
Nguồn
2012-11-19 17:58:25
Bạn có thể cung cấp mã cho AsyncTask hoặc mã gọi nó? –