RxJava流行了那么长的时间,现在也才开始学习,确实有点晚了。学而时习之,不亦说乎!又何必在乎别人的看法呢,只要能让自己不断前进就是好的。下面进入正题。首先了解RxJava到底是用来干嘛的,即它的基本含义。本篇也只是阐述个人在学习Rxjava中的一些理解和基本的使用。
RxJava实质上是一个异步调度处理的程序库,个人看来它将异步的业务逻辑通过相对应的事件响应序列化了操作,从代码看上去可读性更强。做到对R小Java基本的使用,需要了解几个概念,包括Observer、Observable、Subscriber
1.Observable,被观察者,主动发起订阅请求。
2.Observer,事件观察者,用于接收订阅的事件消息(Observable和Subject发送的信息)。
3.Subscriber,是Observer的实现类,也是用于接收订阅消息的,与之不同的在于实现了Observer,并多了onStart()和unsubscribe()方法, 用于取消订阅请求。
4.Subscription ,Observable调用subscribe( )方法返回的对象,同样有unsubscribe( )方法,可以用来取消订阅事件;
5.Action0,是RxJava中的一个接口,它只有一个无参call()方法,且无返回值,Action1,Action2...Action9等,分别拥有1...9个参数
6.Func0:与Action0非常相似,也有call()方法,但是它是有返回值的,同样也有Func0、Func1...Func9;
一般而言,使用RxJava只需要几个基本步骤就可以完成:
一、创建消息订阅者(Observable),有多种创建方式,根据业务需求进行创建。
1.使用create方法创建
Observable observable= Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("hello"); //发送订阅消息" hello "
subscriber.onNext("world!!"); //发送订阅消息" world "
subscriber.onCompleted();//发送订阅消息完成
}
});
2.使用just方法创建
observable = Observable.just("hello "," world "); //内部依次发送" hello "和" world "
3.使用from方法创建
String []names = {"lishi108","hello world"};
observable = Observable.from(names);
4.其他的创建方式
observable = Observable.interval(1, TimeUnit.SECONDS);//每隔一秒发送一次订阅消息
observable = Observable.range(10, 3);//将发送整数10,11,12
observable = Observable.timer(2, TimeUnit.SECONDS); //2秒后发送一次订阅消息
observable = Observable.just("hello").repeat(3);//重复发送3次
二、创建消息接收者(Observer)
实现Observer接口即可
mObserver = new Observer<String>() {
@Override
public void onCompleted() {
//业务处理完后的操作
}
@Override
public void onError(Throwable e) {
//发生异常的处理
}
@Override
public void onNext(String s) {
//接收处理的数据S
}};
三、创建桥梁,即关联操作
observable.subscribe(mObserver);
四、普通使用上面的3个步骤完成即可,但是更多的在在不同线程上操作。下面我们来看看怎么在不同的线程里面进行使用RxJava的操作,这就需要其他几个方法的介绍。
1.subscribeOn()主要改变的是订阅的线程。即call()执行的线程
2.ObserveOn()主要改变的是发送的线程。即onNext()执行的线程。
3.Scheduler线程的控制
控制在不同线程的切换使用:1)Schedulers.immediate():默认的 Scheduler,直接在当前线程运行。
2)Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。
3)Schedulers.io(): 新开线程(常用来读写文件、读写数据库、网络信息交互等)。多数情况下 io() 比 newThread() 更有效率。但是不要把计算工作放在 io() 中,可以避免创建不必要的线程。
4)Schedulers.computation(): 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。
5)Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
observable .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
.subscribe(mObserver);