2017-04-21 6 views
0

を要求します。レトロフィットとRxJava、AndroidのマルチスレッドRESTはこの<a href="http://randomdotnext.com/retrofit-rxjava/" rel="nofollow noreferrer">tuto</a>に従った後、私はそうのようなマルチスレッド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を使う前に2度考えるべきだと付け加えたいと思います。特別なスケジューラー 'io'を使用してください。その理由は、ioスケジューラーがスレッドプールを使用する場合、newThreadが各メソッド呼び出しの新しいスレッドを作成するからです。 – shagi

答えて

3

あなたは、これはあなただけonCompleteのを取得します、しかし、結果を破棄します。この

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

を行うことができます。結果に興味がある場合は、リストやその他のオブジェクトに入れてください:

+1

右クリックして追加します。 subscribeOn(Schedulers.io())。observeOn(AndroidScheduler.mainThread()) – shagi

関連する問題

 関連する問題