RxAndroid Demo https://github.com/klnusbaum/rxandroidexamples
第一部分介绍如何利用RxJava异步加载。第二部分介绍一些高级使用方法。
RxJava,主要有2个模型,Observables 和 Observers,基于监听者的设计模式思想,前者是事件发布者,后者是事件订阅者(通过subsribe方法订阅事件)。(此处不再深入讲解RxJava)
订阅者主要有3个方法:onNext onError onCompleted.
Observable<List<String>> listObservable = Observable.just(getColorList());
listObservable.subscribe(new Observer<List<String>>() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
@Override
public void onNext(List<String> colors) {
mSimpleStringAdapter.setStrings(colors);
}
});
异步加载:
Observable<List<String>> tvShowObservable = Observable.fromCallable(new Callable<List<String>>() {
@Override
public List<String> call() {
return mRestClient.getFavoriteTvShows();
}
});
之前我们用just来创建,这是阻塞的方法,会在UI线程中直接执行,而使用Observable.fromCallable方法有2点不同:
1.在工作线程中执行
2.事件发射的值不会立马创建,直到有一个订阅者subscribe.
mTvShowSubscription = tvShowObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<String>>() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
@Override
public void onNext(List<String> tvShows){
displayTvShows(tvShows);
}
});
此处表示getFavoriteTvShows方法将在工作线程中执行。在一个Schedulers.io的线程中执行,那么当我们拿到了值需要在UI线程中渲染,如果在工作线程中显然不可以,这个时候observeOn(AndroidSchedulers.mainThread)起到了作用,它使得我们onNext中的代码在UI mainThread中执行。
当我们拥有很多订阅者的时候,要关注一个事情,比如页面被释放了,然而还有未处理完的订阅者怎么办?
if (mTvShowSubscription != null && !mTvShowSubscription.isUnsubscribed()) {
mTvShowSubscription.unsubscribe();
}
unsubscribe表示我们不在订阅该事件。 通常这样的代码可能写在onDestory.
让我们来做个总结:
1.Observable.fromCallback方法延迟创建Observable要发送的值。
2.subscribeOn方法允许你指定创建发送值的过程在你指定的线程中。
2.subscribeOn方法允许你指定创建发送值的过程在你指定的线程中。
3.observeOn方法允许你指定观察发送值的过程在你指定的线程中,通常在UI mainThread.