我有一个Observable,它返回一个Cursor实例(Observable<Cursor>)。我试图利用ContentObservable.fromCursor获取onNext回调中的每个游标行。
我想出的解决方案之一就是这样的结构:
ContentObservable.fromCursor(cursorObservable.toBlocking().first())
.subscribe(cursor -> {
// map to object
// add to outer collection
}, e -> {}, () -> {
// do something with list of objects (outer collection)
});由于toBlocking().first()的存在,这看起来很像一次黑客攻击,但它很有效。我不喜欢它,因为大多数处理都是在onNext回调中完成的,我们必须创建外部集合来保存中间结果。
我想这样用它:
cursorObservable.map(ContentObservable::fromCursor)
.map(fromCursor -> fromCursor.toBlocking().first())
.map(/* map to object */)
.toList()
.subscribe(objects -> {
// do something with list of objects
}这仍然使用toBlocking().first(),并且不起作用,因为一旦可观察到的fromCursor完成,光标就关闭了,因此无法将其映射到对象。有没有更好的方法把Observable<Observable<Cursor>>压平到Observable<Cursor>?
发布于 2015-05-06 11:52:16
是否有更好的方法将
Observable<Observable<Cursor>>压平到Observable<Cursor>?
是的,您可以使用Observable.concat方法:
public static void main(String[] args) {
final Observable<String> observable = Observable.just("1", "2");
final Observable<Observable<String>> nested = observable.map(value -> Observable.just(value + "1", value + "2"));
final Observable<String> flattened = Observable.concat(nested);
flattened.subscribe(System.out::println);
}更新
实际上,还有一些其他方法可以将Observable<Observable<Cursor>>转换为Observable<Cursor>。
只要选择一个对你更合适的。
更新2
另一种解决方案是修改代码,使用flatMap操作符而不是map。
cursorObservable.flatMap(ContentObservable::fromCursor)
.map(/* map to object */)
.toList()
.subscribe(objects -> {
// do something with list of objects (outer collection)
}https://stackoverflow.com/questions/30075663
复制相似问题