1.zip操作符
zip操作符可以用于批量网络请求。等所有数据返回后再对数据进行处理
//获取普通主题和热门主题。2次请求均成功后更新数据集
Observable.zip(getPost(), getHotPost(), new Func2<MyResponse<Post>, MyResponse<Post>, Boolean>() {
@Override
public Boolean call(MyResponse<Post> myResponse, MyResponse<Post> myResponse2) {
mData.clear();
mData.addAll(myResponse.msg);
mData.addAll(myResponse2.msg);
return true;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Boolean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(Boolean o) {
mSRL.setRefreshing(false);
mHomeAdapter.notifyDataSetChanged();
}
});
2. Do操作符
在Rxjava有很多的doxxx操作符。DoOnNext就是在onNext后面执行,可用于打印log,保存数据等。如果保存数据到数据库,要等到存储完毕,才会执行后面的操作。如果把doOnNext放在子线程中,也需要等到doOnNext执行完成后才执行subscriber
2.1 doOnNext线程切换
Observable.create(subscriber -> {
subscriber.onNext(1);
printThread("create");//RxCachedThreadScheduler-2
})
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())//如果去掉这条doOnNext和create会在同一线程执行
.doOnNext(o -> printThread("doOnNext"))//RxCachedThreadScheduler-1
.observeOn(AndroidSchedulers.mainThread())
.subscribe(o -> printThread("subscriber"));//main
}
private void printThread(String name) {
Log.i(name + "----Thread", Thread.currentThread().getName());
}