在 Rxjava 中,如果把整個(gè) 事件流看成 是工廠的流水線,Observable 就是原料,Observer 就是我們的產(chǎn)品經(jīng)理。產(chǎn)品如何交到我們的產(chǎn)品經(jīng)理手上?其中重要的就是操作工人(Operator 操作符),它負(fù)責(zé)在 Observable 發(fā)出的事件 和 Observer 的響應(yīng)之間做一些處理。
操作符分類
Creating ObservablesTransforming ObservablesFiltering ObservablesCombining Observables(合并)Error Handling OperatorsObservable Utility Operators(輔助類)Conditional and Boolean OperatorsMathematical and Aggregate Operators(算數(shù))Connectable Observable Operators(背壓)Operators to Convert Observables(連接)自定義操作符有了Observable和Obsever,我們就可以隨便玩了,任取一個(gè)已創(chuàng)建的Observable和Observer關(guān)聯(lián)上,即形成一個(gè)RxJava的例子
// 3.被觀察者訂閱觀察者 observable // 建議在這修改數(shù)據(jù) .map(new Func1<String, String>() { // 第一個(gè)參數(shù)決定 call方法類型,第二個(gè)參數(shù)決定返回值類型 @Override public String call(String arg0) { return arg0 + "湯圓"; } }) .subscribe(observer);observer的onNext方法將會(huì)依次收到來自observable的數(shù)據(jù)”just1”、”just2”,另外,如果你不在意數(shù)據(jù)是否接收完或者是否出現(xiàn)錯(cuò)誤,即不需要Observer的onCompleted()和onError()方法,可使用Action1,subscribe()支持將Action1作為參數(shù)傳入,RxJava將會(huì)調(diào)用它的call方法來接收數(shù)據(jù),代碼如下:
但是,領(lǐng)導(dǎo)突然又不想要所有用戶了,只要名字叫“小明”的用戶,行吧,領(lǐng)導(dǎo)最大,我改(假設(shè)名字唯一):
Observable.create(new Observable.OnSubscribe<List<User>>() { @Override public void call(Subscriber<? super List<User>> subscriber) { List<User> userList = null; ··· //從數(shù)據(jù)庫(kù)獲取用戶表數(shù)據(jù)并賦給userList ··· subscriber.onNext(userList); } }).flatMap(new Func1<List<User>, Observable<User>>() { @Override public Observable<User> call(List<User> users) { return Observable.from(users); } }).filter(new Func1<User, Boolean>() { @Override public Boolean call(User user) { return user.getName().equals("小明"); } }).subscribe(new Action1<User>() { @Override public void call(User user) { //拿到謎之小明的數(shù)據(jù) } });搞定,這時(shí)候領(lǐng)導(dǎo)又說,我不要小明了,我要小明的爸爸的數(shù)據(jù),(坑爹啊~~),我繼續(xù)改:
Observable.create(new Observable.OnSubscribe<List<User>>() { @Override public void call(Subscriber<? super List<User>> subscriber) { List<User> userList = null; ··· //從數(shù)據(jù)庫(kù)獲取用戶表數(shù)據(jù)并賦給userList ··· subscriber.onNext(userList); } }).flatMap(new Func1<List<User>, Observable<User>>() { @Override public Observable<User> call(List<User> users) { return Observable.from(users); } }).filter(new Func1<User, Boolean>() { @Override public Boolean call(User user) { return user.getName().equals("小明"); } }).map(new Func1<User, User>() { @Override public User call(User user) { //根據(jù)小明的數(shù)據(jù)user從數(shù)據(jù)庫(kù)查找出小明的父親user2 return user2; } }).subscribe(new Action1<User>() { @Override public void call(User user2) { //拿到謎之小明的爸爸的數(shù)據(jù) } });RxJava在需求不斷變更、邏輯愈加復(fù)雜的情況下,依舊可以保持代碼簡(jiǎn)潔、可閱讀性強(qiáng)的一面,沒有各種回調(diào),也沒有謎之縮進(jìn)!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注