上一篇文章只是简单的知道了Rxjava是做什么的。但是Java的观察者模式这么多,比如接口回调,广播接收还有我们常用的EventBus.那么RxJava的特点是什么呢。
这篇文章来讲它的第一个特点。
变换
被观察者Observable发射的事件是A,但是观察者处理的事件是B。那么A可以经过变换成为B传给观察者。
举个简单例子,观察者需要把图片放在ImageView上,它有ImageView这个控件,他需要的是一个图片drawable.但是被观察者每次发射的事件是一个resID.这样我们就需要Observable将resID处理一下。
我们先来创建一个发射资源ID的observable。
Observable<Integer> resIDobservable= Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriberAim) {
subscriberAim.onNext(R.mipmap.ic_launcher);
}
});
上面的代码中,注册后就会发射一个R.mipmap.ic_launcher的资源ID。
然后我们将上述observable变换成为发射drawable的对象。
Observable<Drawable> drawableObservable = resIDobservable.map(new Func1<Integer, Drawable>() {
@Override
public Drawable call(Integer integer) {
return getResources().getDrawable(integer);
}
});
上面这段代码中就可以将上个resIDobservable发射出来的int类型的值转化为drawable后并发射出去。而实现变换这一功能的就是就是我们上面代码中的map操作符
可以看到map操作符的参数是一个类对象,这个类对象包含两个泛型,一个是目标类型,一个是原始类型,而类里的call方法则负责将原始类型转换为目标类型。
接下来我们用新的observable绑定观察者,那么就可以直接给观察者发射drawable这个对象了。
drawableObservable.subscribe(new Observer<Drawable>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Drawable drawable) {
imageView.setImageDrawable(drawable);
}
});
这样,我们观察者拿到的就直接是drawable对象可以直接放在我们imageview上。
而这个map是怎么个意思呢?简单的说明一下其中原理。
![](/qrcode.jpg)
执行原理我在上图标记了一下,我只能理解这些,在深一层真的考验我九年义务教育功底了。Emmm,店小胆小,大牛勿喷。
最后,我们来个看上去很牛逼的写法,就是把我上述写的这三段代码链式结构连起来。走一波。
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(R.mipmap.ic_launcher);
}
}).map(new Func1<Integer, Drawable>() {
@Override
public Drawable call(Integer integer) {
return getResources().getDrawable(integer);
}
}).subscribe(new Subscriber<Drawable>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Drawable drawable) {
imageView.setImageDrawable(drawable);
}
});
看上去是不是高大上了很多。
OK,变换就说到这里。RxJava有很多操作符,功能各不相同,但是核心原理都大同小异。写到这里发现很多小细节都没有讲过。下篇补,陆续更。