操作符學習推薦閱讀:官方英文
翻譯中文
先來看乙個簡單的例子
執行上面的例子,將看到以下結果://被觀察者
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...