標籤:map 使用 sch public 重寫 一行代碼 網路 for 鏈式
相信小夥伴在使用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),所以我們自然可以把切換線程的操作加入這裡。
那麼動手吧~
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()); } }; }
observable.compose (schedulersTransformer()).subscribe(subscriber)
Android 勤用RXJava compose操作符消除重複代碼