Retrofit和RxJava,Android多线程REST请求

时间:2017-04-21 14:51:03

标签: android multithreading rx-java retrofit2

所以我对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(...)的所有调用。我怎样才能做到这一点?当完成所有调用以执行另一个操作时,我想要进行某种回调。

由于

1 个答案:

答案 0 :(得分:3)

你可以这样做

    Observable
            .fromIterable(list)
            .flatMap(object -> service.putMethod(/* ... */))
            .ignoreElements()
            .subscribe(/* ... */)

虽然这会丢弃结果,但您只能获得onComplete。如果您对结果感兴趣,可以将它们放在List或其他对象中:

    Observable
            .fromIterable(list)
            .flatMap(object -> service.putMethod(/* ... */))
            .toList()
            .subscribe(/* ... */)