前言
RxJava中在目前Android开发者开发当中使用非常火热,唯一存在的问题就是不太容易上手,但是一旦搞明白他的原理,用法,你会发现在项目开发当中使用它真是太棒了。那么本文就参考网上资料,针对RxJava的基础进行学习总结。
基础
RxJava是什么?
网上对于RxJava的概念解释有很多,在这里我给出我对它的理解,RxJava是一个异步加载的库,rxjava的优势在于简洁,随着程序逻辑变得越来越复杂,rxJava确一直简洁,能够很大程度的提升代码的阅读性。它无非就是用来发送数据和接收数据。
RxJava的几个基本概念:
Observable:数据的发射源,在观察者模式中称为可观察的或者说是被观察者,
Observer:数据的接受源,在观察者模式中称为观察者;
Subscriber:订阅者,也是数据的接收源,它与Observer的区别在于,Subscriber实现了Observer接口,多了一个重要的方法unsubscribe()用来取消订阅事件,当你不再想接收数据了,可以调用该方法停止接收数据,Observer在subscribe()过程中,最终也会转化成Subscriber对象,因此,一般情况下,都建议使用Subscriber作为数据的接收源;
Subscription:Observable在调用subscribe()的时候返回的对象,同样有unsubscribe()方法,也可以用来取消订阅事件;
核心思想:1)RxJava最核心的两个东西是Observable(被观察者)和Subscribers(观察者),由Observable发出事件,通过Subscribers来处理事件。2)Observable和observer通过subscribe()来实现订阅关系,从而使Observable可以在需要的时候发出事件来通知Observer。3)一个Observable可以发出零个或者多个事件,知道结束或者出错。每发出一个事件,就会调用它的Subscriber的onNext()方法,最后调用Subscriber.onNext()或者Subscriber.onError()结束,但是如果一个Observerble没有任何的的Subscriber,那么这个Observable是不会发出任何事件的。
基本用法:
1. 首先需要添加依赖:
在build.gradle文件中的dependencies节点下添加内容:
compile 'io.reactivex:rxjava:1.1.6'
2. 创建可观察者/被观察者对象Observable:
使用create()最基础的方式创建被观察者对象,通过调用onNext()方法发送一个String字符串,执行onCompleted()方法表明数据发送完成,这种方法只有手动调用onCompleted()方法,才会回调Observer的onCompleted()方法。
3. 创建一个观察者Subscribers,来处理Observable对象发出的字符串。
onNext()是成功的回调,onError()是失败的回调,onCompleted()是方法完成时的回调。
4. 通过Subscriber()方法,将我们定义的mSubscriber对象和mObserveable对象关联起来,这样就完成了观察者和被观察者之间的订阅关系。
一旦mSubscriber订阅了mObserveable,mObserveable就会去调用mSubscriber的onNext()方法和onCompleted()方法,mSubscriber就会打印出来字符串hello world!.
简洁代码(基于基本用法):
1. 简化Observable的创建过程,可以通过Observable.just()或者Observable.from()来创建只发出一个事件就结束的Observable对象;
2. 简化Subscriber的创建过程,通过对基础用法的观察,发现对于onComplete()和onError()方法没有过多的关注,这个时候我们就可以使用Action1接口。
subscribe方法有一个重载版本,接受三个Action1类型的参数,分别对应OnNext,OnComplete, OnError函数。在这里我们不太关心onComplete()和onError()方法,因此只需要传一个参数即可onNext。
因此上述代码最终就可以简化成:
拓展:介绍一下Action1这个类;
1) Action X 接口:
可以通过Action X接口来简化Subscriber的创建过程,它的接口有很多,Action0 和 Action1 最常用,还有Action2, Action3,X代表传入的参数的数目。他们其实是对具有不同传入参数、但是无返回值的方法的包装接口。另外subscribe()会根据这些ActionX对象生成正常的Subscriber。
2)Action 0接口:
rxjava的一个接口,只有一个call()方法,没有参数,没有返回值。由于 onCompleted() 方法也是无参无返回值的,因此 Action0 可以被当成一个包装对象,将 onCompleted() 的内容打包起来将自己作为一个参数传入 subscribe() 以实现不完整定义的回调,这样其实也可以看做将onCompleted()方法作为参数传进了subscribe()方法中。
3)Action 1接口:
它也是RxJava的一个接口,同样只有一个call(T param)方法,他有一个参数,没有返回值。与 Action0 同理,由于 onNext(T obj) 和 onError(Throwable error) 也是单参数无返回值的,因此 Action1可以将 onNext(obj) 和 onError(error) 打包起来传入 subscribe() 以实现不完整定义的回调。
实例练习(给imageView设置图片):
总结
总的来说,Observable和Subscriber可以做任何事情,Observable可以是一个数据库查询,Subscriber用来显示查询结果;Observable可以是屏幕上的点击事件,Subscriber用来响应点击事件;Observable可以是一个网络请求,Subscriber用来显示请求结果。