使用 RxJava/RxAndroid 迭代列表 [英] Iterate list with 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屋!