RXJAVA学习之路
--路漫漫其修远兮,吾将上下而求索--屈原
1.引入依赖
github链接:
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
引入依赖:
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
RxJava到底是什么
异步:一个实现异步操作的库。
RxJava 好在哪
代码简洁.
API 介绍和原理简析
扩展的观察者模式
RxJava的观察者模式
四个基本概念:Observable(可观察者,既被观察者),Observable(观察者),subscribe(订阅),事件。
RxJava的回调方法,除了普通事件onNext()(相当于onClick/onEvent)之外,还定义了两个特殊的事件:onCompleted()和onError().
- onCompleted():事件队列完结,RxJava不仅把每个事件单独处理,还会把他们看成一个队列。规定:当不会再有新的onNext()发出时,需要触发onCompleted()方法做标志。
- onError()事件队列异常,onError()会被触发,同时队列终止,不允许再有事件发出。
- 在一个正常运行的事件队列中,两个只能存在一个,若调用了其中一个,就不能调用另一个。
基本实现
创建Observer
Observer<String> observer = new Observer<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { } };
除了Observer接口之外,RxJava还内置了一个实现Observer的抽象类:Subscriber。使用方式与Observe基本一致,区别有两点:
onstart() 会再subscribe刚开始,事件未发送前被调用,例如数据的清零或重置,但是若准备 工作对线程有要求,(例如弹出一个对话框,需要在主线程完成,)onstart()就不适用了,要在指定的线程中做准备工作可以用doOnSubcribe();
unsubcribe() 用于取消订阅,因为在subcribe之后,Observable会持有subcribe的引用,需要及时释放,不然会造成内存泄漏,(在onpause(),onstop())调用此方法,接触引用关系。
创建Observable:被观察者
Observable observable = Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber
线程控制–Scheduler(一)
在不指定线程的情况下,RxJava遵循线程不变的原则,即在那个线程调用subcribe,就在那个线程生产事件,就在那个线程消费事件,,若需要切换线程,就需要用到Scheduler(调度器)
Scheduler的API(一)
RxJava通过调度器来控制那段代码在什么线程中运行,RxJava内置了几个scheduler。
1.schedulers.immediate():直接在当前线程运行,相当于不指定线程。这是默认的scheduler
2.schedulers.newThread():总是启用新线程,并在新线程中操作。
3.schedulers.io();I/O操作(读写文件,读写数据库,网络信息交互)所使用的schedulers。与newThread的区别是在于io()内部实现了一个无数量上限的线程池,可以重用空闲的线程,尽量不要把计算工作放在,io()中,可以避免创建不必要的线程。
4.Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
有scheduler,就可以使用subcribeOn()和observeOn两个方法对线程控制,subcribeOn():制定subcribe()所发生的线程,即observable.OnSubcribe被激活时所处的线程,或者叫事件的生产线程, * observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
修改上面的列子:
final int drawableRes = R.mipmap.h;
final ImageView imageView = (ImageView) findViewById(R.id.imageView);
Observable.create(new Observable.OnSubscribe<Drawable>() {
@Override
public void call(Subscriber<? super Drawable> subscriber) {
Drawable drawable = getTheme().getDrawable(drawableRes);
subscriber.onNext(drawable);
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io())//指定subcribe()发生在io线程
.observeOn(AndroidSchedulers.mainThread())//回调发生在主线程
.subscribe(new Observer<Drawable>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Drawable drawable) {
imageView.setImageDrawable(drawable);
}
});
变换
RxJava提供了对事件序列进行变换的支持,所谓变换就是将事件序列中的对象或者整个序列进行加工,转换成不同的事件,或事件序列。
API
Observable.just("images/logo.png") // 输入类型 String .map(new Func1<String, Bitmap>() { @Override public Bitmap call(String filePath) { // 参数类型 String return getBitmapFromPath(filePath); // 返回类型 Bitmap } }) .subscribe(new Action1<Bitmap>() { @Override public void call(Bitmap bitmap) { // 参数类型 Bitmap showBitmap(bitmap); } });
func1与Action1相似,区别在于func1包装了一个有返回值的方法,map()方法将String对象转化成了一个Bitmap对象,事件类型也有String转换成了一个Bitmap对象。
- map();事件对象的直接转化
- flatmap();