Rxjava工作原理總結

ztq發表於2019-03-06

Rxjava整體工作原理

本質上是觀察者模式:Observer(觀察者)監聽Observable(被觀察者)。每個操作符實際上會建立一個Observable,其中配套會建立一個代理了下一級註冊給它的Observer的Observer。在程式碼鏈的最後進行subsribe時,每一層的Observable會依次逆序(從最後一層到第一層)地把自己的Observer註冊給上一級的Observable,直到第一層的Observable對註冊給它的Observer進行回撥。此時順序(從第一層到最後一層)地回撥下一層的Observer,直至最後一層,流水線就是這樣實現的。

注意:

  1. 因為是鏈式傳遞,所以必須要有一個地方是終止這個關係,即主動對註冊過來的上一級Observer進行回撥,在Rxjava世界中可理解為生產資料,回撥上一級的Observer進行處理、消費。
  2. 基於鏈式的程式碼鏈,每次建立的Observable會包含上一級的Observable。在程式碼鏈最後進行subscribe時,每一層的Observable依次subscribe上一級的Observable。由於上一級的Observable是在當前的Observable中進行subscribe,所以可以先進行一些別的操作(如切換執行緒)再去subscribe。
  3. 因為subscribe到上一級的Observer是一個代理,所以在上一級回撥來的時候可以先進行一些操作(例如切換執行緒、filter、map)再回撥給自己的下一級。就像流水線中每個車間都可以進行加工。
  4. 每一級的Observable能接收的資料型別由上一級決定。因為上一級的Observable例項化泛型引數,後面的Observable在subscribe時需要傳遞一個同泛型引數型別的Observer,所以實現了上一級把資料處理成什麼型別,下一級就接收什麼型別。

Observable分為終點Observable和中間Observable。中間Observable subscribe上一級Observable,處理上一級回撥來的資料,並回撥給下一級Observable。中間Observable既是觀察者也是被觀察者,如各個操作符建立的Observable。終點Observable只產生資料並回撥給下一級。終點Observable只是被觀察者。

操作符舉例

操作符內部命名規則:Observable.XXX()則建立名為ObservableXXX的Observable,建立XXXObserver作為上一級Observer的代理類。

Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        Log.d(TAG, "Observable subscribe() 所線上程為 :" +  Thread.currentThread().getName());
        emitter.onNext("文章1");
        emitter.onNext("文章2");
        emitter.onComplete();
    }
    })
	.subscribeOn(Schedulers.io())
    .subscribe(new Observer<String>() {
         @Override
         public void onSubscribe(Disposable d) {
             Log.d(TAG, "Observer onSubscribe() 所線上程為 :" + Thread.currentThread().getName());
         }

         @Override
         public void onNext(String s) {
             Log.d(TAG, "Observer onNext() 所線上程為 :" + Thread.currentThread().getName());
         }

          @Override
          public void onError(Throwable e) {
              Log.d(TAG, "Observer onError() 所線上程為 :" + Thread.currentThread().getName());
          }

          @Override
          public void onComplete() {
              Log.d(TAG, "Observer onComplete() 所線上程為 :" + Thread.currentThread().getName());
          }
    });
複製程式碼

Observable.create()工作原理:

  1. Observable.create()會建立一個名為ObservableCreate的Observable,然後subscribe的時候呼叫ObservableCreate的subscirbeActual()方法,其中會建立一個實現Disposable介面的類CreateEmitter作為Observer,其代理了下一級subscribe過來的Observer。
  2. subscirbeActual()中把CreateEmitter subscribe給終點Observable,終點Observable呼叫CreateEmitter的onNext(),onCompleted()等方法。因為CreateEmitter是上一級Observer的代理類,所以可以代理onNext()等訊息,例如可以檢查是否中斷分發給下一級Observer的訊息。

Observable.subscribeOn()工作原理:

  1. Observable.subscribe()會建立一個名為ObservableSubscribeOn的Observable,然後subscribe的時候呼叫ObservableSubscribeOn的subscirbeActual()方法,其中會建立一個實現Disposable介面的類SubscribeOnObserver,其中代理了下一級subscribe過來的Observer。
  2. subscirbeActual()根據傳遞過來的Scheduler排程器進行執行緒操作,最後會在Scheduler指定的執行緒中subscribe上一級Observable,從而實現切換執行緒的效果。上一級Observable處理完資料後回撥SubscribeOnObservser的onNext(),onCompleted()等方法。