2016-10-03 22 views
6

Tôi mới đến rxJava/Android và ngạc nhiên rằng onError lambda của tôi đôi khi được gọi vào chính sợi và đôi khi không, mặc dù tôi sử dụng .observeOn(AndroidSchedulers.mainThread())làm thế nào để xử lý các lỗi RxAndroid trong thread chính

Ví dụ 1 : onError vào chính sợi
này hoạt động như mong đợi: onError được gọi vào chính sợi

Observable.error(new RuntimeException("RTE")) 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(s -> { 
       Log.e(TAG, "onNext("+s+")-thread: " + Thread.currentThread().getName()); 
      }, 
      throwable -> { 
       Log.e(TAG, "onError()-thread: " + Thread.currentThread().getName()); 
      }); 

log-đầu ra:

onError()-thread: main 

Ví dụ 2: onErrorKHÔNG vào chính sợi

Observable.create(new Observable.OnSubscribe<String>() { 
    @Override 
    public void call(Subscriber<? super String> subscriber) { 
     subscriber.onNext("one and only"); 
    } 
}) 
.subscribeOn(Schedulers.newThread()) 
.observeOn(AndroidSchedulers.mainThread()) 
.timeout(1, TimeUnit.SECONDS) 
.subscribe(s -> { 
     Log.e(TAG, "onNext("+s+")-thread: " + Thread.currentThread().getName()); 
    }, 
    throwable -> { 
     Log.e(TAG, "onError()-thread: " + Thread.currentThread().getName()); 
    }); 

đầu ra là một cái gì đó như thế này:

onNext(one and only)-thread: main 
onError()-thread: RxComputationScheduler-4  

Tôi nghĩ rằng sau khi gọi observeOn(AndroidSchedulers.mainThread()), TẤT CẢ khí thải nên được thực hiện trên luồng chính.

vì vậy tôi có những câu hỏi này:

  1. tôi không thể tìm thấy bất kỳ tài liệu quy định cụ thể trong hoàn cảnh nào onError được gọi, trong đó chủ đề. Bất cứ ai cũng biết một liên kết?
  2. Tôi thực sự muốn hiển thị một số dấu hiệu lỗi trong GUI: vậy làm thế nào tôi có thể buộc onError được LUÔN gọi trong chủ đề chính?

Trả lời

5

Tôi vừa phát hiện ra rằng tôi chỉ cần thay đổi thứ tự cuộc gọi. Khi tôi gọi observeOn sau timeout nó hoạt động như mong đợi:

.timeout(1, TimeUnit.SECONDS) 
.observeOn(AndroidSchedulers.mainThread()) 

log-đầu ra

onNext(one and only)-thread: main 
onError()-thread: main 

Lý do là, rằng observeOn sẽ chỉ ảnh hưởng đến tất cả mọi thứ bên dưới các cuộc gọi, và chỉ đến khi một số nhà điều hành khác thay đổi một lần nữa. Trong ví dụ trên, timeout() sẽ thay đổi thành chuỗi tính toán.

Lưu ý rằng subscribeOn hoạt động khác nhau. Nó không quan trọng trong chuỗi bạn gọi nó.
Bạn chỉ nên gọi nó là một lần (khi bạn gọi nó là nhiều lần thắng cuộc gọi đầu tiên: xem "Nhiều subscribeOn" trong này Blog)

Đây là một đẹp blog-bài với biết thêm chi tiết: RxJava- Understanding observeOn() and subscribeOn()

2

Bởi vì .timeout(1, TimeUnit.SECONDS) theo mặc định hoạt động trên Schedulers.computation().

+0

nhưng [observOn()] (http://reactivex.io/documentation/operators/observeon.html) nên ghi đè mặc định đó, đúng không? – TmTron

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