2012-01-24 31 views
5

Làm việc trên AsyncTask Tôi tự hỏi tại sao tôi nên sử dụng tham số onPostExecute(), khi tôi chỉ có thể sử dụng biến thể hiện mức lớp trong lớp AsyncTask của mình để chia sẻ dữ liệu giữa doInBackground()onPostExecute().Các tham số của AsyncTask.onPostExecute() so với biến mẫu

Cả hai công việc, nhưng có bất kỳ chuyên gia và con của mỗi cách tiếp cận?

Chỉnh sửa: khi tôi nói 'biến mẫu', tôi đang nói về biến cá thể riêng trong lớp mở rộng AsyncTask. Khi lớp chết, biến cá thể cũng chết.

+1

tôi giả sử hữu ích trong trường hợp AsyncTask của bạn được viết trong một tệp lớp riêng biệt – waqaslam

+0

Đây không phải là vấn đề, bởi vì tôi nghĩ rằng Jop van Raaij có nghĩa là cấp lớp của AsyncTask chính nó –

Trả lời

5

Vâng, nó có thể làm giảm khả năng rò rỉ bộ nhớ, vì bạn không giữ một tham chiếu đến đối tượng của bạn ở cấp lớp, nhưng chỉ có những phương thức AsyncTask đó.

Nó cũng sẽ loại bỏ những vấn đề đồng bộ hóa, như @nico_ekito nêu

+1

Tôi đồng ý với @ a.ch. Và nó cũng tốt hơn cho an toàn luồng. –

+0

Tôi nghĩ câu trả lời này là hợp lệ. Tuy nhiên .. Chỉ có 'AsyncTask' mới có tham chiếu đến biến cá thể. Tôi không thấy dễ bị rò rỉ bộ nhớ. Bởi vì 'doInBackground()' và 'OnPostExecute()' được gọi là đồng bộ, nó không phải là rất có thể xảy ra JVM vẫn làm việc trên biến cá thể khi gọi 'OnPostExcetute()' (nếu điều đó thậm chí có thể). –

0

Cũng như những lý do khác được đăng; nếu bạn nhận được một ngoại lệ trong doInBackground(), bạn chỉ có thể vượt qua một tham số đại diện cho lỗi của bạn onPostExecute() và hủy bất kỳ công việc bổ sung nào, thay vì phải có ngoại lệ khác khi bạn nhận ra rằng tất cả các biến của bạn chưa được khởi tạo đúng cách.

+0

Tôi đoán bạn nên sử dụng 'cancel (boolean)'. Điều này cũng sẽ bỏ qua 'onPostExecute()'. Khi bạn muốn làm việc có điều kiện của trạng thái kết quả từ những thứ bạn làm trong 'doInBackgroud()', bạn phải cung cấp trạng thái trong các tham số (xấu xí để sử dụng cùng tham số cho hai kiểu thông tin), hoặc thiết lập một biến cá thể như 'mSuccess' (giải pháp này tôi đã thấy trong một số hướng dẫn). –

1

Tôi nhận thấy rằng việc sử dụng các biến mẫu trong AsyncTask không phải là luồng an toàn. Trong trường hợp của tôi, nếu tôi bị bắt và Exception trong doInBackground(), tôi sẽ đặt nó vào biến Ví dụ ngoại lệ của AsyncTask. Sau đó, tôi sẽ kiểm tra xem biến đó là null hay không trong onPostExecute() (Tôi không hủy() vì tôi có thể muốn hiển thị một thông báo trong ngoại lệ cho người dùng).

Dù sao, thỉnh thoảng tôi đăng nhập rằng tôi đã bắt được Ngoại lệ trong doInBackground, nhưng trong onPostExecute biến mẫu sẽ là rỗng. Tài liệu này nói rằng các phương thức được gọi là đồng bộ, vì vậy tôi không thể giải thích tại sao điều đó xảy ra, nhưng tôi thấy nó xảy ra nhiều lần.

Cuối cùng, tôi đã thay đổi lớp "Kết quả" của mình để chứa cả ngoại lệ và kết quả ban đầu mà tôi muốn chuyển sang onPostExecute. Điều đó hoạt động tốt.

0

Cho phép tôi phản đối từ câu trả lời được chấp nhận (và những người khác).

Hoàn toàn không có mối lo ngại về an toàn chủ đề về việc sử dụng các trường mẫu trong AsyncTask để chuyển các giá trị từ một cuộc gọi lại đến một cuộc gọi khác. Thông thường, điều này có nghĩa là chuyển các giá trị từ doInBackground() đến onPostExecute(). Các cuộc gọi lại trong AsyncTask được đảm bảo không bao giờ thực hiện đồng thời do đó không có điều kiện chủng tộc, cũng không có cách nào cho một trường thể hiện bị mất hoặc null nếu nó được đặt trong một cuộc gọi lại được thực hiện trước đó. Bây giờ để trả lời.

Ưu điểm của onPostExecute() tham số:

  • Tham số xuất phát từ giá trị trả về của doInBackground() đảm bảo rằng doInBackground() phải cung cấp một giá trị khi trở về, đảm bảo nó không bao giờ bị lãng quên
  • Các tham số là một mối quan hệ thiết lập rõ ràng giữa doInBackground() và gọi lại theo sau: onPostExecute()onCancelled(), trường mẫu có thể phục vụ một số mục đích có thể

Nhược điểm của onPostExecute() tham số:

  • Nó là một tham số duy nhất, do đó bạn không thể vượt qua hai hoặc nhiều giá trị, như một cách giải quyết bạn có thể quấn nhiều giá trị trong một lớp học của sáng tạo của bạn hoặc có lẽ Pair

Ưu điểm và nhược điểm của việc sử dụng trường mẫu để chuyển các giá trị từ doInBackground() đến onPostExecute() về cơ bản là nghịch đảo chính xác của các trường hợp trên.

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