2017-01-19 53 views
3

我是RxJava/RxAndroid的新手,但我坚持使用我的用例。RxJava/RxAndroid的迭代列表

我试着来迭代List<A>转换每个AB异步的(因为它需要调用数据库)和我Observer应该在每一个成功的转换通知(在onNext())做在主线程上的一些工作。

我成功设法转换了整个列表,然后在onNext()收到我的List<B>,但我需要在每个项目上通知,而不是一旦完成所有项目。

我试过的东西与运营商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()