1.RxJava是个啥?
一个异步的响应式扩展库
GitHub上的RxJava链接
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
添加gradle依赖:
compile 'io.reactivex:rxjava:1.2.0'
compile 'io.reactivex:rxandroid:1.2.1'
RxJava操作符的介绍
推荐大家看看操作符分类这篇文章
2.基本使用
1.创建Subscriber订阅者
她决定了事件触发的时候将有怎样的行为。RxJava中的Subscriber的实现方式:
Subscriber subscriber= new Subscriber() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
@Override
public void onNext(Object o) { }
};
顺道看一眼Subscriber这个类
public abstract class Subscriber implements Observer, Subscription {
我们知道了,Subscriber实现了Observer(观察者)这个接口,是在观察者基础上的扩展,所以Subscriber的功能比Observer更丰富。
2.创建Observable被观察者
他决定什么时候触发事件以及触发怎样的事件。
RxJava提供了很多创建Observable对象的方法,我们一个一个看:
- Observable.create()方法,这里会出入一个OnSubscribe参数,通过查看源码,发现,OnSubscribe最终继承了Function接口,而这个接口中啥也没有,我觉得OnSubscribe这个接口主要作用是统一规范,并没有啥特殊的作用,而他里面的call()方法是定义事件发送规则的核心方法。
Observable
这里有一个需要注意的地方就是,当Observabele被订阅时,OnSubscribe中的call()方法会被自动调用,call()方法会 依次 执行Subscriber的回调方法,这样,由于被观察者调用了观察者的回调方法,就实现了由被观察者向观察者的事件传递,即观察者模式。
基于Observable.create()方法,RxJava 还提供了一些方法用来快捷创建事件队列,例如:
- just(T t1, T t2, T t3...)将传入的参数依次发送出来
Observable observable = Observable.just("a", "b", "c");
// 将会依次调用Subscriber中的回调方法:
// onNext("a");
// onNext("b");
// onNext("c");
// onCompleted();
- from(Object[] o)/from(Iterable extends T>),将传入的数组或Iterable拆分为对象后,依次发送出来。
String[] s= {"a", "b", "c"};
Observable observable = Observable.from(s);
// 将会依次调用Subscriber中的回调方法:
// onNext("a");
// onNext("b");
// onNext("c");
// onCompleted();
3.subscribe()订阅
创建了Observable和Subscriber后,用subscribe()方法将他们关联起来。
observable.subscribe(subscriber);
3.线程控制
如果不指定线程的情况下,RxJava遵循的是线程不变的原则,即:在哪个线程调用subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。如果需要切换线程,就需要用到Scheduler(调度器)。
- Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。
- Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。
- Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的Scheduler。行为模式和newThread()差不多,区别在于io()的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下io()比newThread()更有效率。不要把计算工作放在io()中,可以避免创建不必要的线程。
- Schedulers.computation(): 计算所使用的Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个Scheduler使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在computation()中,否则 I/O 操作的等待时间会浪费 CPU。
- 另外, Android 还有一个专用的AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
现在就可以使用subscribeOn()和observeOn()两个方法来对线程进行控制了。
**subscribeOn(): **指定subscribe()所发生的线程,即Observable.OnSubscribe被激活时所处的线程。或者叫做事件产生的线程。
observeOn(): 指定Subscriber所运行在的线程。或者叫做事件消费的线程。
举个栗子:
String[] s = {"a","b","c"};
Observable.from(s)
.subscribeOn(Schedulers.io())//subscribe()方法发生在IO线程
.observeOn(AndroidSchedulers.mainThread())//Subscriber回调发生在主线程
.subscribe(new Action1() {
@Override
public void call(String s) { }
});
subscribeOn(Scheduler.io()和observeOn(AndroidSchedulers.mainThread())
的使用方式非常常见,它适用于多数的 『后台线程取数据,主线程显示』的程序策略。
4.RxJava中的变换
1.map():事件对象的直接变换,具体功能上面已经介绍过。它是 RxJava 最常用的变换。
Observable.just("images/logo.png") // 输入类型 String
.map(new Func1() {
@Override
public Bitmap call(String filePath) { // 参数类型 String
return getBitmapFromPath(filePath); // 返回类型 Bitmap
}
})
.subscribe(new Action1() {
@Override
public void call(Bitmap bitmap) { // 参数类型 Bitmap
showBitmap(bitmap);
}
});
这里出现了一个叫做Func1的类。它和Action1非常相似,也是RxJava 的一个接口,用于包装含有一个参数的方法。Func1和Action的区别在于,Func1包装的是有返回值的方法。另外,和Action一样,FuncX也有多个,用于不同参数个数的方法。FuncX和ActionX的区别在FuncX包装的是有返回值的方法。
最后要说的话:
强烈推荐:给 Android 开发者的 RxJava 详解
本文便是我学习之后所做的简单笔记