2015-09-28 16 views
5

Trong dự án của tôi, tôi cần xử lý các đối tượng theo các chủ đề khác nhau. Để sửa đổi hành vi luồng của tôi tạo ra quan sát mới để thay đổi observeOn() cách này của họ:Cách hiệu quả để thao tác các chủ đề RxJava

apiService.getObjects(token) // Retrofit 
       .compose(bindToLifecycle()) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .doOnNext(o -> { 
        // process in Main Thread 
       }) 
       .map(Observable::just) // create new one, to change thread for it 
       .observeOn(Schedulers.io()) 
       .subscribe(o -> { 
        // process in the background thread 
       }); 

Nhưng tôi nghĩ trong RxJava có nhiều thứ đang cách đẹp và hiệu quả để xử lý một phản ứng trong chủ đề khác nhau. Tôi đã cố gắng để google nó, nhưng tôi đã không tìm thấy bất cứ điều gì.

Cảm ơn,
Anton

Trả lời

3

Trong Rx, nó thường được khuyến khích để tránh tác dụng phụ trong 'làm' khối (mà sẽ chỉ được thực hiện nếu dòng được đăng ký trên), và thích đăng ký mã.

Trong trường hợp của bạn, bạn có thể tận dụng cache() hoặc publish()...connect(), ví dụ:

query = apiService.getObjects(token) 
      .compose(bindToLifecycle()) 
      .subscribeOn(Schedulers.io()) 
      .cache(); 

query.observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(o -> { 
       // process in Main Thread 
      }) 
query.observeOn(Schedulers.io()) 
      .subscribe(o -> { 
       // process in the background thread 
      }); 

Với publish() thay vì cache(), mã là giống hệt nhau nhưng bạn có thể quyết định khi nào kích hoạt truy vấn của bạn bằng cách nối luồng (bạn hãy gọi query.connect() sau khi kết nối 2 đăng ký).

Nếu công việc đăng ký của bạn là tính toán nền, Schedulers.computation() có thể được ưu tiên hơn Schedulers.io().

Lưu ý rằng AFAICT mã của bạn sẽ chỉ làm việc tốt mà không có dòng map(Observable::just), như báo cáo 'observeOn' chỉ tác động đến dòng tiếp tục xuống (và không phải trước đó 'làm' báo cáo)

+0

làm việc như thế tính toán? Và bạn có thể giải thích việc xuất bản -> kết nối không? –

+0

Tôi đã cập nhật câu trả lời để bao gồm 2 câu hỏi đó – Gluck

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