初学Rxjava2我的理解

rxjava在安卓开发中已经有了广泛的应用了,但是因为功能太强大,导致很多想要接触的人不知道怎么从原理上面去理解。网上看了很多例子,一上来基本上都是介绍 Observable 、oberver等等,每次看过来看过去慢慢就绕晕了下面我会通过模拟一个小说迷看一个连载小说的过程,来对整个流程进行讲解。

使用rxjava的话 必须要有的四种东西:
 
Observable(被观察者)
 
Observer (观察者)
 
subscribe(订阅)
 
event(事件)

1、场景

一个人要看一部连载小说的话,想要最快时间去看最新章节的话,不可能实时去盯着这本书的情况。这种情况下就需要去订阅这本小说,然后在小说那边留下了自己的联系方式,当小说有了新的连载之后,然后小说就会根据订阅的人们留下的联系方式去一一通知,

2、示例代码:

//创建被观察者   小说  连载过程 在子线程
Observable<String> book = Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        Log.i(TAG, "ThreadName===" + Thread.currentThread().getName());
        for (int i = 0; i < 100; i++) {
            emitter.onNext("连载" + i);
            Thread.sleep(100);
        }
        emitter.onComplete();
    }
});
//创建观察者   读书的人   在主线程
Observer<String> reader = new Observer<String>() {
    private Disposable d;

    @Override
    public void onSubscribe(Disposable d) {
        this.d = d;
        compositeDisposable.add(this.d);
        Log.e(TAG, "onSubscribe");
    }

    @Override
    public void onNext(String value) {
        Log.e(TAG, "收到了连载的通知:" + value);
    }

    @Override
    public void onError(Throwable e) {
        Log.e(TAG, "onError=" + e.getMessage());
    }

    @Override
    public void onComplete() {
       Log.e(TAG, "收到了完结的通知:");
    }
};
book.subscribeOn(Schedulers.io())  //连载的过程 ====执行在io线程
        .observeOn(AndroidSchedulers.mainThread())//发生变化 通知读书的人======回调在主线程
        .subscribe(reader);//开始的订阅

通过上面的代码就简单的模拟了一次读者看连载小说的过程,下面我就通过上面的代码进行讲解

被观察者Observable也就是上面的小说
观察者Observer 也就是读者。
订阅subscribe方法去完成订阅的行为。
事件event连载事件的发送 ObservableEmitter.onNext()
book.subscribe(reader) 从意思上面来看的话 是小说订阅了读者 ,有点不太好通顺,我觉得应该是为了维护链式编程的原因,你可以这样理解 小说被读者订阅了,这样就会好理解一点。

3、事件介绍

Rxjava还有另外一个比喻,就是用上游来定义被观察者 下游代表观察者

rxjava的所有事件都是由ObservableEmitter发出去的,字面上理解的话就是发射器,有三种事件类型onNext、onComplete、onError

下面的东西可能有点复杂,不太容易理解,我会接着用上面小说的例子来进行讲解。你订阅了这本小说之后,小说可能会给你发送连载消息(onNext)、完结消息(onComplete)、垃圾消息(onError)。

上游可以发送无限个onNext,下游也可以接收无限个onNext。

解释:也就是只要这本小说不完结, 你可以一直收到连载的消息。

当上游发送了一个onComplete/onError后,上游onComplete/onError后的事件将会继续发送,但是下游在收到onComplete/onError事件后不再继续接收事件。

解释:有一天你收到了小说完结的消息并且看完了(看完最后一章的心情是很爽的!!!)但是另外一个人看这本小说很受欢迎,然后就开始写番外篇,然后接着给你发送连载消息或者垃圾信息,你都已经看完了,肯定不会再去关注他了。

上游可以不发送onComplete或者onError事件。

解释:就是说这本小说可以一直不完结,而且也不用给你发垃圾信息

调用onError或者onComplete切断了上游和下游的联系,在联系切断后上游再发送onError事件就会报错,onComplete和onError的调用情况有以下几种:
  • onComplete可以发送多次,但是只会收到一次回调。
  • onError只可以发送一次,发送多次会报错。
  • onComplete之后不可以发送onError,否则会报错。
  • onError之后可以发送onComplete,但是只会收到onError事件。
  • onError的参数不允许为空。

解释:收到完结消息和垃圾消息之后,我就会对这个小说做一个标记,认为就是已经没有用了,然后这个时候如果给我发送了完结消息的话,我也不会关心。但是我收到完结消息或者垃圾信息,如果小说再给我发垃圾消息的话,我就会举报这本小说(也就是会有crash)还有就是只要发送过一次垃圾信息之后,小说再给我发送完结消息的话 我也会认为是垃圾信息。

4、线程切换

上面的代码还涉及到一个线程切换的过程,也就是小说的连载过程是用你自己的时间去处理的,不能影响到读者的时间。所以小说的连载过程(subscribe)是发生在子线程中的,然后最终得到通知的读者处理(onNext,onComplete,onError)是自己主线程中的,那么这两种操作运行的线程是在哪里指定的?就是上面的代码

book.subscribeOn(Schedulers.io()) //连载的过程 ====执行在io线程
.observeOn(AndroidSchedulers.mainThread())//发生变化 通知读书的人======回调在主线程
.subscribe(reader);//开始的订阅
  • subscribeOn(Schedulers.io()):指定observable(被观察者)的subscribe方法运行在后台线程。
    -
  • observeOn(AndroidSchedulers.mainThread()):指定observer(观察者)的回调方法运行在主线程
    rxjava的线程类型有很多种,这里就不多介绍了,有兴趣的可以自己去查阅。

关于这两个函数,还有一点说明:多次调用subscribeOn,会以第一次的为准;多次而调用observeOn则会以求最后一次的为准。====

5、使用CompositeDisposable对观察者的管理

上面还有一个问题,就是如果说我觉得看这个小说没意思了,然后不想看了,小说还会给我一直推送消息,这也就是我们遇到的内存泄漏的原因。那么应该怎么解决呢?我们可以去退订,将留在小说那的联系方式进行注销就好了。下面通过代码来讲解:

Rxjava会为每一个Observer生成一个Disposable(联系方式)进行管理,RxJava提供了一个CompositeDisposable类用于管理这些Disposable,我们只需要将其将入到该集合当中,在Activity的onDestroy方法中,它调用的clear方法,就能避免内存泄漏的发生。

private CompositeDisposable compositeDisposable = new CompositeDisposable();

然后在上面代码的20行的时候通过调用compositeDisposable .add方法添加,然后在合适的时机调用compositeDisposable .clear就可以了。

总结:通过代码和例子结合讲解的话,大家差不多明白了rxjava的整体流程了吧!很多人都知道这些东西,但是找不到在自己的项目中应该用到什么地方,接下来我会通过自己在项目中用到的地方来向大家介绍一些用法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值