rxjava学习笔记

RxJava框架的学习笔记

1、什么是RxJava?

在github上的自我介绍是这样的:

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.

大致意思就是说,是一个在 Java 虚拟机 上使用可观测的序列来组成异步的、基于事件的程序的库。扩展了观察者模式来支持连续的数据或者事件。通俗的来说就是一个第三方的异步的库。

所谓的观察者模式,可以通俗的理解为当微信公众号发布新文章时,会直接通知所有关注它的用户。这里用户是Observe(观察者),公众号是Observable (被观察者),当观察者关注公众号时实际上是一种subscribe,注意这里的订阅是反过来的而不是我们通俗意义上理解的订阅,是被观察者“订阅”了观察者,即公众号“订阅”了用户。当Observable有更新事件,比如发布了一篇新的文章时,会推送通知进行提醒Observe,调用对应的方法,比如说查看这边新的推送。

2、基本使用
  • 创建观察者Observe
  Observer observer = new Observer<String>(){

            @Override
            public void onSubscribe(Disposable d) {
                Log.d("----","onSubscribe" );
            }

            @Override
            public void onNext(String s) {
                Log.d("----", s);
            }

            @Override
            public void onError(Throwable e) {
                Log.d("----", "onError");
            }

            @Override
            public void onComplete() {
                Log.d("----", "onComplete");
            }
        };
  • 创建被观察者Observable
 Observable observable =Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                    emitter.onNext("rxjava");
                    emitter.onComplete();
            }
        });
  • 发生订阅关系
observable.subscribe(observer);
3、异步

Rxjava默认情况下,观察者和被观察者运行在同一进程内。也就是说无法实现我们这个库最初的设计初衷,因此有了一个另外的概念即Scheduler。可以利用Scheduler进行线程的切换。如下例,通过调用observeOn()与subscribeOn()可以分别设置观察者和被观察者在不同线程。比如下例就是被观察者在IO线程执行,观察者在主线程执行,从而实现了异步的目的。

 Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                emitter.onNext("1");
                emitter.onNext("2");
                emitter.onNext("3");
                emitter.onComplete();
            }
        }).subscribeOn(Schedulers.io()) //在io执行上述操作
          .observeOn(AndroidSchedulers.mainThread())//在UI线程执行下面操作
          .subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d("----","开始了");
            }

            @Override
            public void onNext(String s) {
                Log.d("----", s);
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {
                Log.d("----", "complete");
            }
        });

几个常见的线程。

Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。

Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。不要将计算放在IO线程中,而是应放在下一个线程中。

Schedulers.computation(): 计算所使用的线程,比如进行图形的计算。

AndroidSchedulers.mainThread(),运行在主线程

4、Observable的几种创建方式

除了上面所说create方法外,还提供了其他的方式,我们一个个来看。

  • create()
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> e) throws Exception {
        e.onNext("Hello Observer");
        e.onComplete();
    }
});

首先是上文出现过的create(),参数是ObservableOnSubscribe 并重写subscribe方法。这样就可以通过ObservableEmitter调用观察者的方法。

  • just()
Observable.just(1, 2, 3)
.subscribe(new Observer < Integer > () {
    @Override
    public void onSubscribe(Disposable d) {
        Log.d(TAG, "=================onSubscribe");
    }

    @Override
    public void onNext(Integer integer) {
        Log.d(TAG, "=================onNext " + integer);
    }

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

    @Override
    public void onComplete() {
        Log.d(TAG, "=================onComplete ");
    }
});


https://www.jianshu.com/p/143d3ae8d1c6

https://juejin.im/post/5b17560e6fb9a01e2862246f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值