使用 RxJava/RxAndroid 迭代列表 [英] Iterate list with RxJava/RxAndroid

查看:38
本文介绍了使用 RxJava/RxAndroid 迭代列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 RxJava/RxAndroid 的新手,但我坚持使用我的用例.

I'm new to RxJava/RxAndroid but I'm stuck with my use case.

我尝试迭代 List 以将每个 A 异步转换为 B(因为它需要调用数据库)和我的 Observer 应该在每次成功转换时收到通知(在 onNext() 中)在主线程上做一些工作.

I try to iterate a List<A> to convert each A into an B asynchronously (because it needs call to database) and my Observer should be notified on every successful conversion (in onNext()) to do some jobs on the main thread.

我成功地成功转换了整个列表,然后在 onNext() 中收到了我的 List 但我需要在每个项目上得到通知,而不是一次项目已完成.

I successfully managed to convert the entire list and then received my List<B> in onNext()but I need to be notified at each item, not once all items are done.

我尝试使用运算符 from 但如果我使用 from(List) 我的 Observer 必须从相同的类型(A 而不是 B).

I tried something with the operator from but if I use from(List<A>) my Observer must receivied objects from the same type (A and not B).

这是我的代码如何将整个 List 转换为 list 我应该在这里更改什么?

Here is how my code to convert entire List<A> to list<B> What should I change here?

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:这是伪代码.

感谢您的帮助!

推荐答案

如果你想在单独的线程中一个一个地转换每个项目,你可以这样做.

If you want transform each item one by one in separate thread you can do it in this way.

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

            });

如果你已经有 observable 发出列表并且想要将其转换为序列,请使用:

If you already have observable which emit list and want to transform it to sequence use this:

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

            });

如果你想将这两种方式结合起来,在一个地方转换所有的值,但一个一个地发出它们,你可以这样做:

If you want to combine this two ways and transform all values in one place but emit them one by one you can do something like this:

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

        subscriber.onCompleted();
    });

这篇关于使用 RxJava/RxAndroid 迭代列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆