RXJava compose操作符消除重複程式碼

weixin_33866037發表於2017-10-15

信小夥伴在使用RXJava與Retrofit請求網路時,都有遇到過這樣的場景,在IO執行緒請求網路解析資料,接著返回主執行緒setData、更新View試圖,那麼也肯定熟悉下面這幾句程式碼:
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
如果網路請求的次數比較少, 作為一名不拘小節(懶癌)的中二青年還能勉強接受複製貼上上述切換schedulers的程式碼,但是如果請求網路的biz次數多起來了,又不想去破環RX的鏈式結構,那麼怎麼辦呢?其實使用compose操作符每次僅書寫一行程式碼就能完成工作執行緒的切換了!
先看最終效果:
RetrofitClient.singletonDemoService("http://gank.io/api/random/data/")
.requestNet("福利","1")
.compose(schedulersTransformer())
.subscribe(subscriber);
僅僅通過.compose(schedulersTransformer())一行程式碼就完成了執行緒切換。
簡單囉嗦下compose操作符的原理 :
不同於map、flatMap等lift操作改變Observable釋出的事件及序列,compose操作符是直接對當前Observable進行操作(可簡單理解為不停地.方法名().方法名()鏈式操作當前Observable),所以我們自然可以把切換執行緒的操作加入這裡。
那麼動手吧~
1.首先compose()需要傳入一個Observable.Transformer型別的引數,那我們直接在這new一個即可;
2.在上述transformer物件裡,我們通過重寫call 方法,可以拿到一個observable物件,對其進行一系列的lift變換(自然可以切換執行緒);
Observable.Transformer schedulersTransformer() {
return new Observable.Transformer() {
@Override
public Object call(Object observable) {
return ((Observable) observable).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
};
}
3.收工吃飯~
observable.compose (schedulersTransformer()).subscribe(subscriber)
好了,繼續擼程式碼去啦~

相關文章