11

Tôi cần thực hiện một số số AsyncTask và sau đó thu thập tất cả kết quả của chúng, hợp nhất và sau đó trả lại kết quả cuối cùng cho người dùng của tôi.Làm thế nào để sử dụng ExecutorService với Android AsyncTask?

Tôi đang tìm cách quản lý nhiều tài khoản AsyncTask trong Android. Tôi đang nghĩ đến việc sử dụng một số ExecutorService từ gói Java Concurrency nhưng tôi bị kẹt vì ExecutorService chỉ chạy hoặc Runnables hoặc Callables ONLY. Để thiết lập yêu cầu của tôi, tôi có thể sử dụng

ExecutorService.invokeAll((Collection<? extends Callable<T>> tasks)

Phương pháp invokeAll() sẽ trả về một danh sách các List<Future><V>> chỉ khi tất cả các nhiệm vụ đệ trình được hoàn thành và tôi có thể nhận được kết quả của tôi cho mỗi công việc từ của nó tương ứng Future.

Tất cả đều tốt với ExecutorService mong đợi thực tế là nó không chấp nhận AsyncTask.

Có cách nào khác để sử dụng AsyncTaskExecutorService hoặc nếu bạn có thể vui lòng giới thiệu một cách tiếp cận khác.

+1

Điều tốt là [AsyncTask] (http://developer.android.com/reference/android/os/AsyncTask.html) có phương thức executeOnExecutor(), điều xấu là nó chỉ khả dụng kể từ API Cấp 11 – yorkw

+0

Mọi tham chiếu về cách sử dụng executeOnExecutor? Hơn nữa tính năng này có sẵn từ HoneyComb (API Level 11) nhưng minSDK của ứng dụng của tôi là 4. – AKh

+1

Nếu bạn nhấn mạnh, hãy xem câu trả lời của tôi [ở đây] (http://stackoverflow.com/questions/7211684/asynctask-executeonexecutor-before- api-level-11/9509184 # 9509184). – yorkw

Trả lời

1

Tạo một AsyncTask và bắt đầu chủ đề của bạn từ doInBackground(). Khi chúng được thực hiện, thu thập, hợp nhất, vv dữ liệu và trả lại. Sau đó, bạn có thể sử dụng nó trong onPostExecute để cập nhật giao diện người dùng. Bắt đầu quá nhiều luồng sẽ tiêu thụ bộ nhớ, vì vậy bạn nên cân nhắc xem chúng có thực sự cần chạy song song hay không.

+0

AsyncTask chính nó có một nhóm các chủ đề bên trong nó. Chúng tôi có thể sử dụng hồ bơi này để chạy nhiều tác vụ thay vì tôi tạo một tác vụ khác không? – AKh

+1

Không trực tiếp. Đối với 'executeOnExecutor()', mục đích của phương thức này là làm cho nó có thể thực hiện đồng thời nhiều 'AsyncTask', vì bên trong chỉ có thể thực thi một 'AsyncTask' tại một thời điểm (Honeycomb và sau này). Điều đó có nghĩa là nếu bạn bắt đầu hai AsyncTask 's nhiều hơn hoặc ít hơn cùng một lúc, thứ hai sẽ chờ cho người đầu tiên kết thúc trước khi nó bắt đầu. Nếu bạn cần phải làm mọi thứ phức tạp hơn, bạn không cần phải sử dụng một 'AsyncTask', chỉ là mã luồng của bạn như bình thường và sử dụng một Trình xử lý để thông báo cho giao diện người dùng khi bạn nhận được kết quả. –

+0

Nó không TRUE rằng "Điều đó có nghĩa là nếu bạn bắt đầu hai AsyncTasks nhiều hơn hoặc ít hơn cùng một lúc, thứ hai sẽ chờ cho người đầu tiên kết thúc trước khi nó bắt đầu" – Zou

Các vấn đề liên quan