关于RxJava简单用法(一)

RxJava概述

RxJava最近很火的库,以逻辑可读性强,异步操作的简单而被大家喜欢.而且可以随着逻辑的复杂性,依然可以保持可读性强,简洁的特点;

Rxjava基本概念

RxJava采用的是观察者模式.

  • 观察者:监视着被观察者的行为,当被观察者某个状态改变的时候会通知观察者观察者会执行对应的操作;
  • 被观察者:被监视的对象,当某个状态改变的时候会通知观察者
  • 订阅(或注册):将观察者被观察者建立联系。

这里举一个例子,点击Button后触发OnClickListener
中的onClick()事件。在这个事件中他们的角色分别如下:

  • 观察者:OnClickListener;
  • 被观察者:Button;
  • 订阅(或注册):setOnClickListener()。

RxJava中的三个重要角色

  • 观察者:Observer;Subscriber
  • 被观察者:Observable;
  • 订阅(或注册):subscribe()。

Observer:接收源,英文释义“观察者”,没错!就是观察者模式中的“观察者”,可接收Observable、Subject发射的数据;观察者的事件回调方法除了普通事件onNext()(相当于onClick()/onEvent())之外,还定义了两个特殊的事件:onCompleted()和onError()。

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

Subscriber:“订阅者”,也是接收源,那它跟Observer有什么区别呢?Subscriber实现了Observer接口,基本功能是一样的.但是他们的主要区别是下面两点:

  • onStart(): 这是Subscriber增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行),onStart()就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用doOnSubscribe()方法,具体可以在后面的文中看到。
  • unsubscribe(): 这是Subscriber所实现的另一个接口Subscription
    的方法,用于取消订阅。在这个方法被调用后,Subscriber将不再接收事件。一般在这个方法调用前,可以使用isUnsubscribed()先判断一下状态。unsubscribe()这个方法很重要,因为在subscribe()之后,Observable会持有Subscriber的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如onPause()onStop()等方法中)调用unsubscribe()来解除引用关系,以避免内存泄露的发生。

Observable:发射源,英文释义“可观察的”,在观察者模式中称为“被观察者”或“可观察对象”;

subscribe() :创建了Observable和Observer之后,再用subscribe()方法将它们联结起来.

Subject:Subject是一个比较特殊的对象,既可充当发射源,也可充当接收源,为避免初学者被混淆,本章将不对Subject做过多的解释和使用,重点放在Observable和Observer上,先把最基本方法的使用学会,后面再学其他的都不是什么问题;

Subscription :Observable调用subscribe( )方法返回的对象,同样有unsubscribe( )方法,可以用来取消订阅事件;

Action0RxJava中的一个接口,它只有一个无参call()方法,且无返回值,同样还有Action1,Action2...Action9等,Action1封装了含有 1个参的call()方法,即call(T t),Action2封装了含有 2个参数的call方法,即call(T1 t1,T2 t2),以此类推;

Func0:与Action0非常相似,也有call()方法,但是它是有返回值的,同样也有Func0、Func1...Func9;

基本用法

Observable的基本创建方式

Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("A");//发射一个"A"的String
                subscriber.onNext("B");//发射一个"B"的String
                subscriber.onCompleted();//发射完成,这种方法需要手动调用onCompleted,才会回调Observer的onCompleted方
            }
        });

Observer的创建方式

Observer<String> observer = new Observer<String>() {
            @Override
            public void onCompleted() {

              Log.d("onCompleted","完成");

           } 
            @Override 
            public void onError(Throwable e) {

               Log.d("onError",e);

          } 
            @Override 
           public void onNext(String s) {
          Log.d("onNext",s);
         } 
};
订阅
observable.subscribe(observer);

打印结果: A,B,完成;

以上用到的都是rx包里面的,别用错了!!!

如果你不在意数据是否接收完或者是否出现错误,即不需要Observer的onCompleted()和onError()方法,可使用Action1,subscribe()支持将Action1作为参数传入,RxJava将会调用它的call方法来接收数据,代码如下:

observable.subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.d("call",s);//结果:A,B
            }
        });
上面案例还可以写成

observable.subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.d("onNext",s);
            }
        }, new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
                Log.d("onError",throwable.toString());
            }
        }, new Action0() {
            @Override
            public void call() {
                Log.d("onCompleted","完成");
            }
        });
打印结果:A,B,完成;和上面的一样;(参数Action含义对照上面案例)


现在有个疑问,为什么使用Action也能达到使用Subscriber的结果?进subscribe(Action1 onNext)的源码看看。


实际上也就是调用了action的call方法;

把这两位大神的博客合并了一下形成本文章
http://www.jianshu.com/p/19cac3c5b106

http://www.jianshu.com/p/5e93c9101dc5

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值