2017-01-19 5 views
3

Я новичок в RxJava/RxAndroid, но я застрял в своем прецеденте.Iterate list with RxJava/RxAndroid

Я пытаюсь перебирать в List<A> преобразовать каждый A в B асинхронно (потому что он должен позвонить в базу данных), и мой Observer должен быть уведомлен о каждом успешном преобразовании (в onNext()), чтобы сделать некоторые работы в главном потоке.

Мне удалось преобразовать весь список, а затем получить List<B> в onNext(), но мне нужно знать, что у каждого товара не все предметы.

Я пытался что-то с оператором from, но если я использую from(List<A>) мои Observer должны receivied объекты из того же типа (A и не B).

Вот как мой код для преобразования всего 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

Если вы хотите преобразовать каждый элемент по одному в отдельном потоке, вы можете сделать это таким образом.

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

Здесь .. простой пример:

public static void main(String[] args) { 
    String[] s = {"a", "b", "c"}; 
    Observable.from(s).map(value -> "A"+value).subscribe(result -> System.out.println(result)); 
    Observable.timer(2, TimeUnit.SECONDS).toBlocking().subscribe(); 
} 

Как вы упомянули, я использую массив для простоты, даже список может использоваться как параметр для from()