2017-01-19 8 views
3

私はRxJava/RxAndroidを使い慣れていますが、私の使用事例は残っています。RxJava/RxAndroidでリストを反復する

私は(それがデータベースへの呼び出しを必要とするため)非同期Bに各Aを変換するList<A>を反復処理しようとすると、私のObserverは、メインスレッド上でいくつかの仕事をするために(onNext()で)成功するたびに、変換に通知する必要があります。

リスト全体の変換に成功し、List<B>onNext()に受信しましたが、すべての項目が完了してからではなく、各項目に通知する必要があります。

私は、オペレータfromで何かをしようとしたが、私が使用している場合from(List<A>)Observerは、同じタイプ(AなくB)からオブジェクトをreceivied必要があります。

コード全体をList<A>に変換する方法はこちらですlist<B>ここで変更する必要がありますか?

private List<A> listOfA; 

private startConversion() { 
    Observer observer = new Observer<List<B>>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 
      e.printStackTrace(); 
     } 

     @Override 
     public void onNext(List<B> convertedItems) { 
      onConversionCompleted(convertedItems); 
     } 
    }; 

    Observable<B> observervable = Observable.fromCallable(new Callable<List<B>>() { 
     @Override 
     public List<B> call() throws Exception { 
      return convertListOfAToListOfB(listOfA); 
     } 
    }); 

    subscription = observable 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(observer); 
} 

PS:これは擬似コードです。

ありがとうございました!

答えて

4

各項目を別々のスレッドで1つずつ変換したい場合は、このようにすることができます。すでにリストを放出し、シーケンスの使用にそれを変換したい、観察している場合

Observable.from(list)  
      .map(input -> { 
       // transform each A -> B 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(item -> { 

      }); 

この:あなたはこの二つの方法を組み合わせて、一つの場所ですべての値を変換するが、それらを放出する場合

 listObservable 
      .flatMap(Observable::from) 
      .subscribe(item -> { 

      }); 

Observable.create(subscriber -> { 
     for (Item item : items) { 
      subscriber.onNext(transformA2B(item)); 
     } 

     subscriber.onCompleted(); 
    }); 
0

ここでは簡単な例で..です::

012あなたはこのような何かを行うことができます一つ一つ

リストに記載されているとおり、わかりやすくするために配列を使用していても、リストをパラメータとして使用できますfrom()