所以我对Reactive编程很陌生,在遵循这个tuto后,我能够发送多线程REST请求,如下所示:
Retrofit2界面:
@FormUrlEncoded
@PUT("path")
Observable<String> putMethod(
@Field("field") String field,
...
);
Retrofit2 builder:
private NetRequestService() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(END_POINT)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
service = retrofit.create(RetrofitInterface.class);
}
请求:
public void putMethod(Context context, List<Object> objectList){
for(Object o: objectList) {
service.putMethod(
"field",
...
)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public final void onCompleted() {
}
@Override
public final void onError(Throwable e) {
Log.e("Error", e.getMessage());
}
@Override
public final void onNext(String response) {
Log.e("Response", response);
}
});
}
}
一切正常,问题是为每次调用调用onCompleted()方法(如预期的那样),但我想知道何时完成对service.putMethod(...)的所有调用。我怎样才能做到这一点?当完成所有调用以执行另一个操作时,我想要进行某种回调。
由于
答案 0 :(得分:3)
你可以这样做
Observable
.fromIterable(list)
.flatMap(object -> service.putMethod(/* ... */))
.ignoreElements()
.subscribe(/* ... */)
虽然这会丢弃结果,但您只能获得onComplete。如果您对结果感兴趣,可以将它们放在List或其他对象中:
Observable
.fromIterable(list)
.flatMap(object -> service.putMethod(/* ... */))
.toList()
.subscribe(/* ... */)