Android 勤用RXJava compose操做符消除重複代碼

相信小夥伴在使用RXJava與Retrofit請求網絡時,都有遇到過這樣的場景,在IO線程請求網絡解析數據,接着返回主線程setData、更新View試圖,那麼也確定熟悉下面這幾句代碼:css

.subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber);

若是網絡請求的次數比較少, 做爲一名不拘小節(懶癌)的中二青年還能勉強接受複製粘貼上述切換schedulers的代碼,可是若是請求網絡的biz次數多起來了,又不想去破環RX的鏈式結構,那麼怎麼辦呢?其實使用compose操做符每次僅書寫一行代碼就能完成工做線程的切換了!api

先看最終效果:網絡

RetrofitClient.singletonDemoService("http://gank.io/api/random/data/") .requestNet("福利","1") .compose(schedulersTransformer()) .subscribe(subscriber);

僅僅經過.compose(schedulersTransformer())一行代碼就完成了線程切換。less

簡單囉嗦下compose操做符的原理 :

不一樣於map、flatMap等lift操做改變Observable發佈的事件及序列,compose操做符是直接對當前Observable進行操做(可簡單理解爲不停地.方法名().方法名()鏈式操做當前Observable),因此咱們天然能夠把切換線程的操做加入這裏。dom

那麼動手吧~
  • 1.首先compose()須要傳入一個Observable.Transformer類型的參數,那咱們直接在這new一個便可;ide

  • 2.在上述transformer對象裏,咱們經過重寫call 方法,能夠拿到一個observable對象,對其進行一系列的lift變換(天然能夠切換線程);spa

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)
相關文章
相關標籤/搜索