Tôi có 2 ASyncTask, một truy xuất giá trị từ httpPost và bản cập nhật khác một số thành phần của giao diện người dùng (bao gồm cả chế độ xem danh sách). Vấn đề là vì cả hai ASyncTask đều chia sẻ cùng một luồng nền, nếu opper mạng bắt đầu đầu tiên và chạy chậm (do kết nối mạng kém). Các chủ đề nền khác mất quá nhiều thời gian làm cho ứng dụng vô trách nhiệm.ASyncTask chặn người khác
Vì cả hai ASyncTask là độc lập nên khá là ngu ngốc để chờ người khác. Nó sẽ là asynctasks hợp lý hơn các lớp khác nhau sử dụng các chủ đề khác nhau, tôi có sai không?
Đọc tài liệu ASyncTask. Nói về việc sử dụng executeOnExecutor(), nhưng làm cách nào tôi có thể giải quyết điều đó ở cấp API thấp hơn 11?
Ở đây đi một ví dụ nhỏ mà tái tạo các "vấn đề"
new Task1().execute();
new Task2().execute();
Với
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);
}
}
Tại sao bạn có AsyncTask để cập nhật giao diện người dùng? Bạn cần phải thực hiện đồng bộ trên chuỗi Ii. Giao diện người dùng của bạn AsyncTask có làm gì khác trên luồng nền không? –
Tôi sử dụng nó ví dụ để hiển thị một listview với các tin tức. Trong onPreExecute tôi hiển thị giao diện loading(), trong nền lấy thông tin từ Internet và trong onPostExecute gán adapter cho listview. Cách tiếp cận đó có đúng không? – Addev
@Addev: Tại sao bạn không chỉ bắt đầu 'AsyncTask' thứ hai trong phương thức' onPostExecute (...) 'đầu tiên? Nếu những gì bạn cần là một trong những 'AsyncTask' dựa trên kết quả của khác thì bạn có hiệu quả có một yêu cầu đồng bộ và bạn không nên chạy hai hoạt động không đồng bộ song song. – Squonk