Rxjava1的理解和思考
Rxjava是一种基于观察者模式的,以数据流的方式,是一种响应式编程的体现。
Rxjava是在安卓层面,是备受大家喜欢的一种技术。
一:首先贴官方的地址:
RxJava的github地址: https://github.com/ReactiveX/RxJava
RxAndroid的github地址: https://github.com/ReactiveX/RxAndroid
如果有时间可以浏览官方的网站进行源码阅读。
对于Rxjava的集成:
dependencies {
implementation 'io.reactivex:rxjava:1.2.0'
implementation 'io.reactivex:rxandroid:1.2.1'//RxJava在Android平台的扩展,包含了一些能够简化Android开发的工具
}
在Rxjava1.x中,需要弄清楚几个概念,Observable 被观察者,subscribe 绑定,Observer观察者。
对于观察者模式,在学习23种设计模式的时候,就有接触过观察者模式,所以对于上述的观察者和被观察者是不陌生的。
那么有了这些基本认识,那么怎么用Rxjava来帮助我们写业务呢?
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("1");
subscriber.onNext("2");
subscriber.onNext("3");
subscriber.onCompleted();
}
});
上述就是一个被观察者,这个被观察者创建了一个绑定关系,只有等到观察者与被观察者订阅了之后,才会真正开始执行上述的绑定关系,然后绑定关系中的业务逻辑就会被触发。
Observer<String> observer = new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
}
};
上边这个就是一个观察者,这个观察者在接受到数据之后,需要做的一些业务逻辑。可以看到这个观察者回调有三个方法,onNext() 可能被多次调用,onComplete() 和onError()这两个方法只会被触发一次。
observable.subscribe(subscriber);
好,就是上述的代码,就完成了观察者和被观察者之间的订阅。为什么是被观察者去订阅观察者呢?这是个好问题,是因为在后续的链式调用。
上述的Rxjava在使用过程中,这是最简单的使用。
Rxjava提供了大量的操作符,这些操作符在日常的工作给各种不同的业务场景提供了便捷的操作。
from()
just()
map()
flatMap()
等等常用到的这些操作符在特定的场景下使用。
当然,在使用Rxjava的时候,说到最多的就是线程的切换,这种线程切换的方式,很大程度上简化了日常写代码的方式。
不得不说Rxjava中的Schedulers,在Schedulers中提供了这些可调度的线程:
computation, io, newThread 和 trampoline
那么在Rxjava的链式调用过程中,如何指定线程呢?
int drawableRes = ...;
ImageView imageView = ...;
Observable.create(new OnSubscribe<Drawable>() {
@Override
public void call(Subscriber<? super Drawable> subscriber) {
Drawable drawable = getTheme().getDrawable(drawableRes));
subscriber.onNext(drawable);
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
.subscribe(new Observer<Drawable>() {
@Override
public void onNext(Drawable drawable) {
imageView.setImageDrawable(drawable);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
}
});
可以看到,subscribeOn()指定的线程是绑定关系所在的线程。
observeOn()是指观察者的调用所在的线程。对于observeOn()的调用,因为链式调用可以使用多个操作符,因此,可以指定多个观察者执行的线程。
Rxjava在一推出,就受到广大开发者的喜爱,因为这些思想简化了日常工作线程的切换操作,以及简化了日常工作中各种业务流程的转换和调用。如果能够熟练的使用RxJava的操作符,那么在些复杂业务逻辑的时候,就会让代码非常的简洁明了。当然对于一种技术的熟练程度也要求开发者有这个学习能力,能够掌握并且熟练使用本来就非易事。
对于安卓开发者来讲,安卓的业务有一个绕不开的点,就是线程安全问题。所有涉及到UI的操作,都必须得在主线程中执行,否则就会报错。
为什么会有这个问题,根本原因是因为多线程控制UI的操作,代驾太大,无法满足移动设备对性能要求,所以就这么设计的。如果不这么设计,会出现什么问题呢?就是你在子线程中更新一个控件的展示,在另一个线程中就可能拿到不是它想要的内容,这就对业务开发造成困扰,所以就在一个线程中执行,这样就能保证业务的编写相对来讲简单易维护。
好了,为什么要提安卓的线程安全问题,北京有说了,这里要介绍就是RxJava对于安卓业务开发,如何去切换主线程问题,因为RxJava在开发业务的过程中,几乎都要涉及到UI 的展示,那么就涉及到安卓的主线程问题。RxJava如何来切换到主线程呢?可以看到 引入的RxAndroid这库,在这里其实就是使用Handler(Looper.getMainLooper())来获取主线程的looper,这样就能将业务切换到安卓的主线程中了。
对于安卓主线程业务调用,使用AndroidSchedulers.mainThread() 就能切换安卓的主线程。
OK,上边就是对于Rxjava1.x的理解。权做记录。我知道文章格式肯定一塌糊涂,暂且不管。