2012-05-08 49 views
6

Vì vậy, tôi đang làm việc trên bộ giải mã mã vạch, khi chúng tôi có mã vạch chuyển tới API bội số qua internet để giải mã những gì vừa được quét. Vấn đề là tôi phải liên kết một số phân tích cú pháp XML với nhau, và tôi không biết liệu tôi có làm đúng không.Android AsyncTask bên trong AsyncTask

Vì vậy, khi mã vạch được quét, chương trình của tôi gọi ASyncTask chạy qua API để truy xuất tên sản phẩm. Khi nó có tên, tôi muốn nó gọi một ASyncTask khác. Tôi biết điều này là có thể bằng cách instantiating một ASyncTaks trong các onPostExecute() của khác, nhưng, tôi nghĩ rằng điều này là sai, bởi vì nó giống như hộp trong hộp. Vì vậy, không phải là nó có thể/tốt hơn để khởi tạo ASyncTask thứ hai của tôi bên trong hoạt động chính của tôi, và làm cho nó đợi cho đến khi ASyncTask đầu tiên của tôi kết thúc?

(tiếng Anh không phải là ngôn ngữ chính của tôi, tôi hy vọng tôi đã tự làm rõ).

+3

Lý do sử dụng 2 tác vụ là gì? tại sao không làm những gì bạn muốn trong các nhiệm vụ đầu tiên doInBackground? – Renard

+2

Chúng ta không nên làm cho niềm vui của ngôn ngữ của một người (tiếng Anh) vì nó có thể không phải là ngôn ngữ chính của mình – waqaslam

+0

@Renard nó có vẻ quá nhiều lộn xộn để cho tất cả mọi thứ trong doInBackground. ASyncTask đầu tiên của tôi có thể trả về các kết quả khác nhau mà trước tiên cần phải được xử lý, và sau đó, theo kết quả, làm một số phân tích cú pháp hơn. Vì vậy, khởi chạy ASyncTask khác cho phép tôi chia mã trong nhiều bên và làm cho nó rõ ràng hơn. – MagicMicky

Trả lời

17

Tôi nghĩ đó là hoàn toàn hợp pháp để bắt đầu thứ hai AsyncTask trong onPostExecute của AsyncTask đầu tiên, trộn cả hai hoạt động là một ý tưởng logic xấu , Như "The Offspring" đã nói - "Bạn phải giữ chúng tách biệt"

Nếu bạn không muốn nó trực tiếp trong chính điện thoại onPostExecute, hãy đặt trình xử lý để thực hiện nó trong hoạt động và gọi bộ xử lý này từ onPostExecute.

Và điều cuối cùng - Nếu bạn có nhiều logic - hãy chuyển nó sang một tệp riêng biệt, đừng giữ tất cả ở cùng một tệp.

+0

Được rồi, tôi sẽ cố gắng thiết lập một trình xử lý trong hoạt động của tôi và gọi nó từ 'onPostExecute()'. Và vâng, tôi có nhiều tệp, thậm chí nhiều gói. Đây là dự án Android thực đầu tiên của tôi, tôi muốn nó càng sạch càng tốt! – MagicMicky

+0

- Chúc may mắn. :) – MByD

1

Trong các trường hợp như vậy, có thể tốt hơn cho các hoạt động chạy hàng loạt dài cùng nhau trong một AsyncTask.

Một lựa chọn khác là sử dụng các API lật, điều này làm cho nhiệm vụ chaining được kết dễ dàng hơn nhiều http://developer.android.com/guide/topics/fundamentals/loaders.html

0

Bạn có thể tìm cách tiếp cận khác nếu bạn thường phải đối mặt với tình huống như thế này. Đó là kết hợp các yêu cầu và các hoạt động bên trong các runnables/callables và để quản lý chúng một cách riêng biệt trong khi nói một hàng đợi ví dụ. Đây là một cách tiếp cận tốt đẹp. http://ugiagonzalez.com/2012/07/02/theres-life-after-asynctasks-in-android/