• Android 勤用RXJava compose操作符消除重复代码


    相信小伙伴在使用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)
  • 相关阅读:
    创建对象_原型(Prototype)模式_深拷贝
    创建对象_工厂方法(Factory Method)模式 与 静态工厂方法
    创建对象——单例(Singleton)模式
    模板方法模式
    移除HTML5 input在type="number"时的上下小箭头
    颜色名列表
    什么是盒模型?
    JQuery中$.ajax()方法参数详解
    zsh下docker命令tab补全方法
    ubuntu14.04 搭建gitlab服务
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7291894.html
Copyright © 2020-2023  润新知