从Android开发者的角度去理解RxJava(二)

上一篇文章只是简单的知道了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有很多操作符,功能各不相同,但是核心原理都大同小异。写到这里发现很多小细节都没有讲过。下篇补,陆续更。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值