2012-07-27 31 views
5

Tôi đang cố cập nhật trạng thái giao diện người dùng khi nhận được thông báo đẩy. Để làm điều này, tôi cần phải bắt đầu một AsyncTask thực hiện một số hoạt động mạng và sau đó cập nhật giao diện người dùng dựa trên kết quả.Sử dụng BroadcastReceiver để khởi chạy AsyncTask

Theo tài liệu cho BroadcastReceiver, thực hiện các thao tác không đồng bộ trong bộ thu không an toàn vì quá trình thực thi nó có thể bị hủy ngay sau khi trả về.

Có phải là BroadcastReceiver đang chạy trong quá trình riêng của mình hoặc trong cùng một quá trình với Hoạt động có chứa không? Vì tôi chỉ quan tâm đến việc hoàn thành nhiệm vụ miễn là có một giao diện người dùng để cập nhật, tôi không lo lắng về việc AsyncTask chết nếu hoạt động bị đóng. Giả sử BroadcastReceiver là trong quá trình tương tự như các hoạt động, điều này làm cho nó okay/an toàn để khởi động nhiệm vụ tôi đã mô tả từ bên trong người nhận?

Edit:

Để làm rõ, tôi đăng ký nhận trong hoạt động của onResume() và unregistering nó onPause(), vì vậy nó chỉ nên được nhận ý đồ khi hoạt động đã được kích hoạt.

+0

Tại sao không sử dụng 'Dịch vụ' thay vì BroadcastReceiver nếu nó không an toàn? Nó sẽ hoàn thành điều tương tự, nhưng không có vấn đề bạn nói đến. – Andy

+0

@Andy Tôi hiểu rằng việc sử dụng 'Dịch vụ' sẽ an toàn trong mọi trường hợp, nhưng tôi đang cố gắng xác định xem nó có thực sự cần thiết trong trường hợp cụ thể này hay không. – jnackman

+1

Vâng, đó là nếu bạn nghĩ về nó. Các dịch vụ hoàn hảo để chạy các hoạt động không đồng bộ. Do đó tại sao cùng một giới hạn không có mặt. BroadcastReceivers chủ yếu được sử dụng cho những thứ khác như khi một cái gì đó xảy ra trong hệ thống, không thực sự khi dữ liệu đang được cập nhật thông qua mạng. Do đó "Broadcast". Trong khi một 'Service' là nó là gì, một dịch vụ mà bạn đang chạy ở phía bên mà người dùng không cần phải biết. Hy vọng rằng có ý nghĩa. – Andy

Trả lời

5

Bộ thu phát không chạy trên quy trình riêng của nó, nó đang chạy trên chuỗi giao diện người dùng.

Quy trình của bạn sẽ bị hủy sau khi bật Phương thức nhận lại chỉ khi không có hoạt động hoặc dịch vụ nào khác trong ứng dụng của bạn đang chạy.

Nếu máy thu phát của bạn là phiên bản của lớp bên trong và chỉ nhận khi hoạt động của bạn đang hoạt động, thì quá trình của bạn sẽ không bị hủy sau khi phương thức trả về.

+0

[liên kết tới tài liệu chính thức] (http://developer.android.com/reference/android/content/BroadcastReceiver.html#ProcessLifecycle) – renadeen

0

Điều tôi khuyên bạn nên làm là startActivity(intent) từ bộ thu phát sóng. Đó là tất cả. Bên trong mục đích tôi sẽ cung cấp thông tin sự kiện mà bạn nói, bạn chỉ có thể đặt một tham số trong gói. Sau đó, bạn có thể kiểm tra điều này bên trong Hoạt động onStart() hoặc onCreate() tùy theo điều kiện nào được gọi. Nếu cờ ở đó, sau đó từ Activity, hãy khởi động số AsyncTask.

Không cần sử dụng dịch vụ nào cả, với tất cả các giới hạn ràng buộc và giao tiếp từ hoạt động dịch vụ.

Hãy nhớ rằng bạn cũng có thể startActivityForResult(). Tôi nghĩ rằng bạn không muốn làm bất cứ điều gì ngoại trừ vượt qua và chuyển tiếp bên trong một máy thu phát sóng.

BTW, Hoạt động không cần phải có giao diện người dùng. Có thể có các hoạt động vô danh.

+0

Như bạn đã đề cập - _… các hoạt động không cần phải có giao diện người dùng_ - sau đó tôi khuyên anh ta sử dụng dịch vụ… Tôi nghĩ rằng các hoạt động được sử dụng cho giao diện người dùng và dịch vụ cho các tác vụ nền. –

1

Nếu bên trong AsyncTask, bạn cần ngữ cảnh, sau đó tôi nghĩ dịch vụ sẽ tốt hơn. Nếu không, không có vấn đề gì khi sử dụng AsyncTask.

1

Trước khi tổ ong (API11), bạn phải sử dụng dịch vụ.

Kể từ Honeycomb (API11), bạn có thể sử dụng goAsync():

này có thể được gọi bằng một ứng dụng trong onReceive (Context, Ý định) để cho phép nó để giữ cho quảng bá hoạt động sau khi trở về từ đó chức năng .Điều này không làm thay đổi mong đợi tương đối đáp ứng với chương trình phát sóng (hoàn thành trong vòng 10 giây), nhưng cho phép thực hiện để di chuyển công việc liên quan đến nó qua một chủ đề khác để tránh bị trục trặc giao diện người dùng chính do đĩa IO.

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