RxJava操作符學習

2021-07-08 15:06:39 字數 3652 閱讀 4146

操作符學習推薦閱讀:官方英文

翻譯中文

先來看乙個簡單的例子

//被觀察者

observable.onsubscribeintegeronsubscribe = new observable.onsubscribe()

};//觀察者

subscriberintegersubscriber = new subscriber()

@override

public void onerror(throwable e) {}

@override

public void onnext(integer i)

};//訂閱

observable.create(integeronsubscribe)

.subscribe(integersubscriber);

執行上面的例子,將看到以下結果:

123

oncompleted

那麼在這過程中發生了什麼呢?一起到原始碼裡看看!

先來看看create(),在observable類中,有這樣的定義:

final onsubscribeonsubscribe;

protected observable(onsubscribef)

public final static observablecreate(onsubscribef)

也就是說,上面的例子中,我們的integeronsubscribe物件被onsubscribe變數引用了。

接著來再看與subscribe()有關的關鍵的**:

public final subscription subscribe(subscriber<? super t> subscriber) 

private static subscription subscribe(subscriber<? super t> subscriber, observableobservable)

注意最關鍵的**observable.onsubscribe.call(subscriber),這裡的observable.onsubscribe也就是我們的integeronsubscribe物件引用,而subscriber就是我們傳入subscribe()integersubscriber物件。所以這句**的中變數替換為上面例子的物件就變為:

integeronsubscribe.call(integersubscriber);
也就是說在integeronsubscribe.call()中執行了

integersubscriber.onnext(1);

integersubscriber.onnext(2);

integersubscriber.onnext(3);

integersubscriber.oncompleted();

因此,我們的程式也就依次輸出了

123

oncompleted

總結一下整個過程就是:有乙個被觀察者integersubscriber和乙個觀察者integersubscriber,使用subscribe()使他們產生訂閱關係,subscribe()所做的事情就是,將觀察者傳遞給被觀察者的call(),並在call()中執行觀察者的onnext()oncompleted()

integersubscriber.call(integersubscriber);
由於lift()接受乙個操作符引數,所以我們這裡使用map()來講lift(),也可以隨便了解map(),假設**是這樣的:

observable.onsubscribemyonsubscribe = new observable.onsubscribe() 

};subscribermysubscriber = new subscriber()

};func1myfunc = new func1()

};observable.create(myonsubscribe)

.map(myfunc)

.subscribe(mysubscriber);

這裡只看.map(myfunc)這一句**,其他部分分析可以檢視開頭的例子。先看看map()的原始碼:

public final observablemap(func1<? super t, ? extends r> func)
出現了lift(),進入看看:

//經過刪減和修改的**

public final observablelift(final operator<? extends r, ? super t> operator)

}//總是返回新被觀察者物件

return new observable(onsub);

}

可以看到,lift()總是建立乙個新的被觀察者。在看看new operatormap(func)幹了什麼:

public final class operatormapimplements operator

@override

public subscriber<? super t> call(final subscriber<? super r> o) };}

}

換成上面例子的變數,則lift()

observable.onsubscribeonsub = new onsubscribe()

}onsubscribe.call(st); <=== myonsubscribe.call(st)

}}

訂閱時:

observable.create(myonsubscribe)

.map(myfunc) <=== return new observable(onsub)

.subscribe(mysubscriber); <=== onsub.call(mysubscriber)

所以執行流程為:

//本例中t=1    

myonsubscribe.call(st) -> st.onnext(t) -> mysubscriber.onnext(myfunc.call(t))

RxJava筆記 RxJava操作符

用來建立observable。public static observablecreate onsubscribef 把其他型別的物件和資料型別轉化成observable。observable.just 123 把其他型別的物件和資料型別轉化成observable。與just區別在與引數返回值不同 ...

RxJava常用操作符

用於建立observable 被觀察者 的操作符 用於對observable發出的資料進行變換的操作符 用於從observable發射的資料中選擇性的過濾一些資料的操作符 用於將多個observable組合成乙個單一的observable的操作符 有助於從observable的錯誤通知中恢復的操作符...

RxJava條件操作符

1 all 判斷事件序列是否全部滿足某個事件,如果都滿足則返回true,反之返回false 方法簽名 public final observableambwith observablesource other observable.just 1,2,3,4 all new predicate int...