源码在GitHub上
首选说说RxJava是什么?
RxJava总结起来就是两个字,异步。RxJava主要要是用来实现异步操作,常用为网络请求(Retrofit+RxJava),和延迟操作(Flowable.time())
|
如何引入Rxjava?
添加远程依赖,一般RxJava和RxAndroid配套使用
compile 'io.reactivex.rxjava2:rxjava:2.1.2'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
RxJava2与RxJava的比较
RxJava |
RxJava2 |
RxJava最核心的东西就是Observable和Observer。 |
RxJava2最核心的是Flowable和Consumer |
Observable(可观察者)用于发出数据
Observer(观察者)接受数据,接收Observable中发出数据
|
Flowable(被观察者)发出数据
Consumer(观察者)接收数据,接收 Flowable中发出的数据
|
有了观察者和被观察者,还需要一个订阅(subscribe)
以下为一个RxJava2最基本的使用:
Flowable.just("Hello RxJava").subscribe(new Consumer() {
@Override
public void accept(@NonNull String s) throws Exception {
ToastUtils.showShort(s);
}
}, new Consumer() {
@Override
public void accept(@NonNull Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
延时操作
Flowable.timer(5000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(@NonNull Long aLong) throws Exception {
ToastUtils.showShort("延迟操作");
}
}, Throwable::printStackTrace);
注:Flowable.timer默认是在分线程中,如果更改UI、Toast,需要返回主线程。
这里使用RxAndroid,AndroidSchedulers.mainThread
使用RxJava与lambda表达式结合,实现输出
/**
* 未使用Lambda表达式
*/
Flowable.just("Hello RxJava").subscribe(new Consumer() {
@Override
public void accept(@NonNull String s) throws Exception {
ToastUtils.showShort(s);
}
}, new Consumer() {
@Override
public void accept(@NonNull Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
/**
* 使用Lambda表达式
*/
Flowable.just("Hello RxJava Lambda").subscribe(s -> {
ToastUtils.showShort(s);
}, Throwable::printStackTrace);
从上面可以看出,使用Lambda表达式可以很大程度的减少代码量
关于Lambda表达式,看另一篇文章, Android中Lambda表达式的使用,以及如何引入
Rxjava中进行耗时操作,需要使用subscribeOn和observeOn
Flowable.fromCallable(new Callable() {
@Override
public String call() throws Exception {
SystemClock.sleep(2000);
return "Done";
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> {
ToastUtils.showShort(s);
cancelLoading();
}, Throwable::printStackTrace);
注:Schedulers.io()分线程中操作,AndroidSchedulers.mainThread()返回主线程
代码在GitHub上面