Điều này đã được yêu cầu trong một trong các cuộc phỏng vấn trên Android. Tôi đã được hỏi liệu có thể bắt đầu một tác vụ không đồng bộ khác (để cho nó là Task2) từ phương thức doInBackground() của tác vụ async 1 (để cho nó là Task1). Tôi đã xem qua các tài liệu có nội dung sau:Tác vụ không đồng bộ Android thực hiện
Ví dụ về tác vụ phải được tạo trên chuỗi giao diện người dùng.
thực thi (Params ...) phải được gọi trên chuỗi giao diện người dùng.
Theo những tuyên bố này, tôi cho rằng không nên bắt đầu tác vụ từ phương thức nền của tác vụ khác. Ngoài ra, tác vụ không đồng bộ có các phương thức giao diện người dùng (mà không thể được sử dụng trên một chuỗi nền), do đó củng cố lập luận của tôi và tôi đã trả lời nó là không thể.
Khi kiểm tra trên một ứng dụng demo đơn giản, tôi thấy rằng nó thực sự có thể làm như vậy. Một số code demo:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
init();
Log.v ("gaurav", "Thread is : " + Thread.currentThread().getName());
Task1 task = new Task1();
task.execute();
}
class Task1 extends AsyncTask {
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
Log.v ("gaurav", "Thread task 1 is : " + Thread.currentThread().getName());
Task2 task = new Task2();
task.execute();
return null;
}
}
class Task2 extends AsyncTask {
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
Log.v ("gaurav", "Thread task 2 is : " + Thread.currentThread().getName());
Log.v ("gaurav", "Task 2 started");
return null;
}
}
tôi nhận được các bản ghi sau chỉ thực hiện thành công:
> 08-07 09:46:25.564: V/gaurav(2100): Thread is : main 08-07
> 09:46:25.564: V/gaurav(2100): Thread task 1 is : AsyncTask #3 08-07
> 09:46:25.564: V/gaurav(2100): Thread task 2 is : AsyncTask #4 08-07
> 09:46:25.564: V/gaurav(2100): Task 2 started
Tôi đã kiểm tra này trên ICS, KK và L thiết bị và nó hoạt động tốt cho tất cả.
Một lý do tôi có thể nghĩ là tôi không ghi đè bất kỳ phương thức giao diện người dùng nào và thực hiện bất kỳ cập nhật giao diện người dùng nào trong nhiệm vụ thứ hai của mình, do đó nó không gây ra bất kỳ sự cố nào, nhưng tôi không chắc chắn. Ngay cả khi đó là trường hợp, nó vi phạm các quy tắc luồng được đề cập trong hướng dẫn dành cho nhà phát triển.
Để tham khảo, tôi cũng đã kiểm tra liên kết này: Start AsyncTask from another AsyncTask doInBackground() nhưng trạng thái câu trả lời để bắt đầu tác vụ thứ hai bằng phương thức runOnUiThread() bên trong doInBackground(). Tôi muốn được giúp đỡ về những gì đang xảy ra ở đây. Cảm ơn.
Lý do khác tôi đã sử dụng câu hỏi tương tự trong cuộc phỏng vấn là xác định xem ứng cử viên k nows về phá vỡ các thay đổi hành vi thread trong AsyncTasks từ Honeycomb trở lên: http://stackoverflow.com/questions/21165505/mutliple-asynctasks-with-sequential-execution – adelphus
@adelphus, tôi hoàn toàn không thể hiểu được ý nghĩa của "Bắt đầu với HONEYCOMB, các tác vụ được thực hiện trên một luồng đơn để tránh các lỗi ứng dụng phổ biến do thực thi song song. " Nó xác định về việc thực hiện nối tiếp, nhưng các nhiệm vụ lồng nhau sẽ vẫn chạy onPreExecute()/onPostExecute() của chúng trên luồng nền trong ngữ cảnh của câu hỏi của tôi? Hoặc như câu trả lời dưới đây nói về tải lớp khi khởi động ứng dụng, trong trường hợp này tất cả các phương thức onPre/onPost của nhiệm vụ lồng nhau chạy trên chuỗi giao diện người dùng bất kể từ nơi nhiệm vụ được bắt đầu? –
Có hai vấn đề ở đây: nhận xét của tôi là nói về thực tế là nhiều AsyncTask được sử dụng để chạy song song với 1 chuỗi cho mỗi tác vụ. Kể từ khi tổ ong, nhiều AsyncTasks hiện đang xếp hàng để tất cả chúng chạy trên một sợi đơn - chỉ có 1 có thể chạy cùng một lúc. Sự thay đổi đã phá vỡ rất nhiều mã bởi vì các dev giả định các tác vụ chạy song song. Câu hỏi của bạn về việc thực thi onPreExecute/onPostExecute trên chuỗi giao diện người dùng có phải là vấn đề khác hay không, nhưng yaa110 mô tả nó tốt trong câu trả lời của anh ấy. – adelphus