使用RxJava/RxAndroid迭代列表

12

我对RxJava/RxAndroid还不熟悉,但我的用例有困难。

我尝试迭代一个 List<A>,将每个 A 异步转换为一个 B(因为需要调用数据库),并且我的 Observer 应该在每次成功转换时(在 onNext() 中)通知执行一些主线程上的任务。

我成功地完成了整个列表的转换,然后在 onNext() 中收到了我的 List<B>,但我需要在每个条目完成时得到通知,而不是等所有项目都完成后再通知我。

我尝试使用操作符 from,但如果我使用 from(List<A>),我的 Observer 必须接收来自同一类型(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个回答

21

如果你想逐个地将每个项目在单独的线程中进行转换,可以按照以下方式完成。

    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
Observable
    //Loop through the list and emit value one by one
    .fromIterable(intList)
    //Modify the list item to new item
    .map(listItem -> listItem + 10)
    //Update UI or do anything here
    .doOnNext(System.out::println)
    //Convert to new list after modifying each item
    .toList()
    .subscribe(
        newList -> "You will get new list",
        error -> "error"
    );

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()的参数。


0
你也可以使用Observable.fromIterable(list)从列表中创建一个可观测的列表。然后,你可以遍历这些项并将其转换成List。
 Observable.fromIterable(list)
            .filter(item -> item.getId().equals("SampleId")
            .toList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接