相信小伙伴在使用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
不一样于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()); } }; }
observable.compose (schedulersTransformer()).subscribe(subscriber)