2013-05-17 25 views
11

Tôi vừa mới bắt đầu xem xét sốcủa GreenRobot dành cho Android và có câu hỏi về luồng.Sự kiện luồng bằng GreenRobot EventBus

Tôi có một quy trình chạy dài mà tôi muốn chạy trên một chuỗi nền, khi hoàn thành, cập nhật giao diện người dùng.

Vì vậy, một cái gì đó như:

public void onEventBackgroundThread(MyEvent event) { 
     doSomeLongRunningProcess(); 
     updateUI(); 
    } 

Rõ ràng updateUI() không thể được gọi ở đây vì nó cũng sẽ chạy ở chế độ nền.

Vì vậy, cách nào được khuyến nghị để xử lý việc này? Kích hoạt một sự kiện khác từ trong số onEventBackgroundThread() của tôi sẽ chạy trên chuỗi giao diện người dùng? Hoặc bắn nó từ chính quy trình chạy dài? Hoặc là có một mô hình tốt hơn?

Trả lời

21

Tôi có thể sẽ kích hoạt một sự kiện khác khi bạn nhận được kết quả.

public void onEventBackgroundThread(MyEvent event) { 
    doSomeLongRunningProcess(); 
    EventBus.getDefault().post(new MyEventResult()); 
} 

Hãy nhận biết mặc dù: reading the docs, bạn tìm thấy điều này:

BackgroundThread: Subscriber sẽ được gọi trong một thread nền. Nếu chuỗi đăng không phải là chủ đề chính, thì phương thức xử lý sự kiện sẽ là được gọi trực tiếp trong chuỗi đăng. Nếu chuỗi đăng là chủ đề chính , EventBus sử dụng một chuỗi nền đơn sẽ phân phối tất cả các sự kiện theo tuần tự. Trình xử lý sự kiện bằng chế độ này nên cố gắng quay lại nhanh để tránh chặn luồng nền.

Nếu bạn mất một thời gian dài trong phương pháp này, các cuộc gọi lại của EventBus sẽ bị trì hoãn mà có thể sẽ chuyển sang ứng dụng không hồi đáp.

Bạn có thể muốn sử dụng onEventAsync:

Async: Sự kiện phương pháp xử lý này được gọi là trong một thread riêng biệt. Đây là luôn độc lập với chuỗi bài đăng và chuỗi chính. Sự kiện đăng không bao giờ chờ các phương thức xử lý sự kiện bằng chế độ này. Phương thức xử lý sự kiện sẽ sử dụng chế độ này nếu quá trình thực thi của chúng có thể là mất một khoảng thời gian, ví dụ: để truy cập mạng. Tránh kích hoạt số lớn các phương thức xử lý không đồng bộ dài chạy đồng thời để giới hạn số lượng các chuỗi đồng thời. EventBus sử dụng một hồ bơi thread để sử dụng lại hiệu quả các luồng từ trình xử lý sự kiện không đồng bộ hoàn chỉnh thông báo.

+0

Cảm ơn, Pedro. Và đánh giá cao đề xuất của bạn về onEventAsync. – jFort

3

Tôi muốn đề xuất kích hoạt một sự kiện khác sẽ được xử lý theo phương pháp onEventMainThread.

Điều này có tác động tích cực của updateUI không được gọi nếu tất cả người nhận chưa đăng ký (ví dụ: hoạt động chưa đăng ký vì đã bị hủy).

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