2010-07-26 68 views
23

onPostExecute thực hiện nếu số AsyncTask đã bị hủy không?onPostExecute trên bị hủy AsyncTask

Nếu nó thực hiện, có an toàn khi nói rằng tôi nên luôn luôn hỏi nếu nhiệm vụ đã bị hủy bỏ (isCancelled) vào đầu onPostExecute, trước khi làm bất cứ điều gì khác?

+0

Xem thêm [câu hỏi này] (http://stackoverflow.com/q/10163763/165674). –

Trả lời

63

Các hành vi tài liệu của onPostExecute trên hủy bỏ() được thay đổi giữa Android 2 và Android 4.

Android 2.3.7 onPostExecute:

Chạy trên thread UI sau doInBackground. Kết quả được chỉ định là giá trị được trả về bởi doInBackground hoặc null nếu tác vụ đã bị hủy hoặc một ngoại lệ đã xảy ra.

Android 4.0.1 onPostExecute:

Chạy trên thread UI sau doInBackground. Kết quả được chỉ định là giá trị được trả về bởi doInBackground. Phương thức này sẽ không được gọi nếu tác vụ đã bị hủy.

Vì vậy, nếu bạn vẫn đang nhắm mục tiêu thiết bị Android 2, bạn nên giả định rằng onPostExecute sẽ được gọi và trong onPostExecute kiểm tra kết quả rỗng.

+3

Câu trả lời vô cùng hữu ích! –

7

Từ kinh nghiệm của tôi, onPostExecute() thực sự không được gọi khi tác vụ bị hủy. Tuy nhiên, có thể hủy nhiệm vụ sau khi doInBackground() của công việc đã hoàn thành nhưng trước khi lệnh onPostExecute() được gọi - trong trường hợp này, onPostExecute() thực sự được gọi. Vì vậy, để chắc chắn, tôi gọi phương thức isCancelled() trong onPostExecute() và chỉ "return" nếu tác vụ đã bị hủy bỏ. Nó làm việc cho tôi.

+1

Có thực sự đúng không? Ý tôi là - làm thế nào tôi có thể tái tạo nó? Bất kỳ mã thử nghiệm hoặc ý tưởng về điều này? –

5

Sau khi kiểm tra mã nguồn AsyncTask có vẻ như onPostExecute được gọi ngay cả khi tác vụ bị hủy. Tuy nhiên, trước khi gọi onPostExecute kết quả được đặt thành null (?) Nếu tác vụ đã bị hủy.

Chỉnh sửa: @bain cung cấp cập nhật answer.

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