我已经像这样使用Rxjava设置了Retrofit
Retrofit retrofit = ApiManager.getAdapter();
final SplashApiInterface splashApiInterface = retrofit.create(SplashApiInterface.class);
final Observable<List<Data>> observable = splashApiInterface.getTenData(offset);
observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).unsubscribeOn(Schedulers.io())
.subscribe(new Subscriber<List<Data>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(List<Data> dataList) {
splashListener.takeDataToPres(dataList);
}
}
});
我的要求是这样的,api一次生成10个数据的列表,我需要查询所有这些数据,将偏移值增加10,然后将这些数据附加到列表中。如何使用RxJava for android实现这一目标?
答案 0 :(得分:1)
你可以这样做:
Observalbe.range(0, 100) // specify offset range
.filter(i -> i%10==0) // takes only a multiples of ten
.concatMap(i -> splashApiInterface.getTenData(i)) // makes subsequent API calls for each offset value
.flatMap(data -> Observable.from(data)) // flattens each list
.toList() // and collects all items to a single list
... // apply schedulers, subscribe and process your result list
您可以同时触发所有API调用。要实现这一目标 - 只需将concatMap
替换为flatMap
。
没有lamdas的代码(RxJava 1.2.4):
Observable.range(0, 100)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer i) {
return i % 10 == 0;
}
})
.concatMap(new Func1<Integer, Observable<? extends List<Data>>>() {
@Override
public Observable<? extends List<Data>> call(Integer i) {
return splashApiInterface.getTenData(i);
}
})
.flatMap(new Func1<List<Data>, Observable<? extends Data>>() {
@Override
public Observable<? extends Data> call(List<Data> data) {
return Observable.from(data);
}
})
.toList()