美文网首页
Rxjava1的理解和思考

Rxjava1的理解和思考

作者: 大宝京湘玉 | 来源:发表于2022-12-23 20:04 被阅读0次

    Rxjava是一种基于观察者模式的,以数据流的方式,是一种响应式编程的体现。

    Rxjava是在安卓层面,是备受大家喜欢的一种技术。

    一:首先贴官方的地址:
    RxJava的github地址: https://github.com/ReactiveX/RxJava

    RxAndroid的github地址: https://github.com/ReactiveX/RxAndroid

    如果有时间可以浏览官方的网站进行源码阅读。
    对于Rxjava的集成:

    dependencies {

    implementation 'io.reactivex:rxjava:1.2.0'
    
    implementation 'io.reactivex:rxandroid:1.2.1'//RxJava在Android平台的扩展,包含了一些能够简化Android开发的工具
    

    }

    在Rxjava1.x中,需要弄清楚几个概念,Observable 被观察者,subscribe 绑定,Observer观察者。

    对于观察者模式,在学习23种设计模式的时候,就有接触过观察者模式,所以对于上述的观察者和被观察者是不陌生的。

    那么有了这些基本认识,那么怎么用Rxjava来帮助我们写业务呢?

    
    Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
    
        @Override
    
        public void call(Subscriber<? super String> subscriber) {
    
            subscriber.onNext("1");
    
            subscriber.onNext("2");
    
            subscriber.onNext("3");
    
            subscriber.onCompleted();
    
        }
    
    });
    
    

    上述就是一个被观察者,这个被观察者创建了一个绑定关系,只有等到观察者与被观察者订阅了之后,才会真正开始执行上述的绑定关系,然后绑定关系中的业务逻辑就会被触发。

    
    Observer<String> observer = new Observer<String>() {
    
        @Override
    
        public void onCompleted() {
    
        }
    
        @Override
    
        public void onError(Throwable e) {
    
        }
    
        @Override
    
        public void onNext(String s) {
    
        }
    
    };
    
    

    上边这个就是一个观察者,这个观察者在接受到数据之后,需要做的一些业务逻辑。可以看到这个观察者回调有三个方法,onNext() 可能被多次调用,onComplete() 和onError()这两个方法只会被触发一次。

    
    observable.subscribe(subscriber);
    
    

    好,就是上述的代码,就完成了观察者和被观察者之间的订阅。为什么是被观察者去订阅观察者呢?这是个好问题,是因为在后续的链式调用。

    上述的Rxjava在使用过程中,这是最简单的使用。

    Rxjava提供了大量的操作符,这些操作符在日常的工作给各种不同的业务场景提供了便捷的操作。

    from()
    just()
    map()
    flatMap()

    等等常用到的这些操作符在特定的场景下使用。

    当然,在使用Rxjava的时候,说到最多的就是线程的切换,这种线程切换的方式,很大程度上简化了日常写代码的方式。
    不得不说Rxjava中的Schedulers,在Schedulers中提供了这些可调度的线程:
    computation, io, newThread 和 trampoline

    那么在Rxjava的链式调用过程中,如何指定线程呢?

    int drawableRes = ...;
    
    ImageView imageView = ...;
    
    Observable.create(new OnSubscribe<Drawable>() {
    
        @Override
    
        public void call(Subscriber<? super Drawable> subscriber) {
    
            Drawable drawable = getTheme().getDrawable(drawableRes));
    
            subscriber.onNext(drawable);
    
            subscriber.onCompleted();
    
        }
    
    })
    
    .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
    
    .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
    
    .subscribe(new Observer<Drawable>() {
    
        @Override
    
        public void onNext(Drawable drawable) {
    
            imageView.setImageDrawable(drawable);
    
        }
    
        @Override
    
        public void onCompleted() {
    
        }
    
        @Override
    
        public void onError(Throwable e) {
    
            Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
    
        }
    
    });
    
    

    可以看到,subscribeOn()指定的线程是绑定关系所在的线程。
    observeOn()是指观察者的调用所在的线程。对于observeOn()的调用,因为链式调用可以使用多个操作符,因此,可以指定多个观察者执行的线程。

    Rxjava在一推出,就受到广大开发者的喜爱,因为这些思想简化了日常工作线程的切换操作,以及简化了日常工作中各种业务流程的转换和调用。如果能够熟练的使用RxJava的操作符,那么在些复杂业务逻辑的时候,就会让代码非常的简洁明了。当然对于一种技术的熟练程度也要求开发者有这个学习能力,能够掌握并且熟练使用本来就非易事。

    对于安卓开发者来讲,安卓的业务有一个绕不开的点,就是线程安全问题。所有涉及到UI的操作,都必须得在主线程中执行,否则就会报错。
    为什么会有这个问题,根本原因是因为多线程控制UI的操作,代驾太大,无法满足移动设备对性能要求,所以就这么设计的。如果不这么设计,会出现什么问题呢?就是你在子线程中更新一个控件的展示,在另一个线程中就可能拿到不是它想要的内容,这就对业务开发造成困扰,所以就在一个线程中执行,这样就能保证业务的编写相对来讲简单易维护。

    好了,为什么要提安卓的线程安全问题,北京有说了,这里要介绍就是RxJava对于安卓业务开发,如何去切换主线程问题,因为RxJava在开发业务的过程中,几乎都要涉及到UI 的展示,那么就涉及到安卓的主线程问题。RxJava如何来切换到主线程呢?可以看到 引入的RxAndroid这库,在这里其实就是使用Handler(Looper.getMainLooper())来获取主线程的looper,这样就能将业务切换到安卓的主线程中了。

    对于安卓主线程业务调用,使用AndroidSchedulers.mainThread() 就能切换安卓的主线程。

    OK,上边就是对于Rxjava1.x的理解。权做记录。我知道文章格式肯定一塌糊涂,暂且不管。

    相关文章

      网友评论

          本文标题:Rxjava1的理解和思考

          本文链接:https://www.haomeiwen.com/subject/osciqdtx.html