上一篇文章只是简单的知道了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的意思就是说每一个原Observeable发射出一个resId对象,那么map操作符就将输入的resid转化为drawable对象。简单的说明一下其中原理。

 

执行原理我在上图标记了一下,我只能理解这些,在深一层真的考验我九年义务教育功底了。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有很多操作符,功能各不相同,但是核心原理都大同小异。写到这里发现很多小细节都没有讲过。下篇补,陆续更。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐