2017-04-21 67 views
0

所以我很新的反应式编程,跟随这tuto我能送多线程REST的请求,像这样经过:改造和RxJava,Android的多线程REST请求

Retrofit2接口:

@FormUrlEncoded 
@PUT("path") 
Observable<String> putMethod(
    @Field("field") String field, 
    ... 
); 

Retrofit2建设者:

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

下面的答案是正确的,但我想补充一点,你应该在使用Schedulers.newThread之前考虑三次。使用特殊的调度程序'io'。其原因是,newThread会为每个方法调用新thred,当IO调度器使用线程池为。 – shagi

回答

3

你可以做到这一点

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

这虽然放弃的结果,你只会得到的onComplete。如果你对结果感兴趣,你可以把它们放在列表或其他对象中:

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

对,并添加。 subscribeOn(Schedulers.io())。observeOn(AndroidScheduler.mainThread()) – shagi