Android RxJava第一弹之原理详解、使用详解、常用场景(基于Rxjava2.0)

本文深入解析Android环境下RxJava2.0的原理,包括扩展的观察者模式、基本实现、线程控制及常用操作符。通过实例展示了RxJava在三级缓存、心跳检测、遍历集合和并发任务等场景的应用,帮助开发者掌握RxJava的使用技巧。
摘要由CSDN通过智能技术生成

Android RxJava第一弹之原理详解、使用详解、常用场景(基于Rxjava2.0)
Android RxJava第二弹之RxJava封装库 RxJava+Animation RxJava+Glide
Android RxJava第三弹之RxJava2.0尝鲜

本人参考以下文章

给 Android 开发者的 RxJava 详解—扔物线

Rxjava 2.0 与 Rxjava 1.0有什么不同

注:原理讲解可能会用到rx1.0的概念,但是代码示例部分用rx2.0 来展示

引言

很多做android开发朋友对rxjava都有熟悉,github上也出现了很多的基于rxjava的开源库,比如 RxBus RxBinding RxPermission,如果我们了解了RxJava的原理,那么我们也可以很轻松的通过RxJava来封装我们自己的库。后面会有简单的例子来用RxJava来封装Animation。

好了,开始我们的正文

RxJava介绍和原理简析

RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.

It extends the observer pattern to support sequences of data/events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety and concurrent data structures.

RxJava是一个实现反应性扩展框架的Java虚拟机:用于通过使用观察序列构成异步和基于事件的程序库。

扩展了观察者模式,以支持数据/事件序列,并增加了操作符,他可以将将序列清晰的组合在一起的。这些序列组合可以是抽象出来的某些数据/事件,如低级别的线程,同步,线程安全和并发数据结构。

概括的的文字刚开始一般是看不懂的,简单来说RxJava就是一个实现异步操作的库。

扩展的观察者模式

官方的概括中提到了扩展的观察者模式,那么我们先从此入手

观察者模式

Java_观察者模式(Observable和Observer)

在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作。
这里Observable(被观察者)对象的变化是采用注册(Register)或者称为订阅(Subscribe)的方式告诉Observer(观察者)。

RxJava的观察者模式

RxJava 有四个基本概念:Observable (可观察者,即被观察者)、Observer (观察者)、 subscribe (订阅)、事件。ObservableObserver 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer

与传统观察者模式不同, RxJava 的事件回调方法除了普通事件 onNext() (相当于 onClick() / onEvent())之外,还定义了两个特殊的事件:onCompleted()onError()

onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志。
onError(): 事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。
在一个正确运行的事件序列中, onCompleted()onError() 有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted()onError() 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。

备:RxJava2.0还添加了一个新的回调方法:onSubscribe(),这是为了解决RxJava1.0backpressure问题,后面会讲到

RxJava观察者模式的图如下

这里写图片描述

RxJava的基本实现

因为RxJava2.0引入了很多新的接口,我们在讲原理的时候,直接拿着2.0的代码来做示例,但是有些得放用2.0不太好理解,我们就用1.0的代码来理解原理吧

创建Subscriber(2.0)/Observer(2.0)

        Subscriber<String> subscriber = new Subscriber<String>() {
            @Override
            public void onSubscribe(Subscription s) {
                Logger.i("hello  onSubscribe");
            }

            @Override
            public void onNext(String s) {
                Logger.i("hello  onNext-->" + s);
            }

            @Override
            public void onError(Throwable t) {
                Logger.i("hello  onError");
            }

            @Override
            public void onComplete() {
                Logger.i("hello  onComplete");
            }
        };
        Observer<String> observer = new Observer<String>() {

            @Override
            public void onSubscribe(Disposable d) {
                Logger.i("hello  onSubscribe");
            }

            @Override
            public void onNext(String value) {
                Logger.i("hello  onNext-->" + value);
            }

            @Override
            public void onError(Throwable e) {
                Logger.i("hello  onError");
            }

            @Override
            public void onComplete() {
                Logger.i("hello  onComplete");
            }
        };

Subscriber 和 Observer的接口是分别独立的,Obsesrver用于订阅Observable,而Subscriber用于订阅Flowable

创建Flowable(2.0)/Observable(2.0)

Observable 即被观察者,它决定什么时候触发事件以及触发怎样的事件。 RxJava 使用 create()方法来创建一个Observable,并为它定义事件触发规则

        Flowable<String> stringFlowable = Flowable.create(new FlowableOnSubscribe<String>() {
            @Override
            public void subscribe(FlowableEmitter<String> e) throws Exception {
                Logger.i("---rxHelloFlowable---");
            }
        }, FlowableEmitter.BackpressureMode.BUFFER);
        Observable<String> stringObservable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                e.onNext("Hello");
                e.onNext("Inke");
                e.onComplete();
            }
        });

可以看到,这里传入了一个 ObservableOnSubscribe对象作为参数,它的作用相当于一个计划表,当 Observable被订阅的时候,ObservableOnSubscribesubscribe()方法会自动被调用,事件序列就会依照设定依次触发(对于上面的代码,就是观察者Subscriber

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值