展平可观察<可观察<cursor>&gt;到Observable <cursor>

时间:2015-05-06 11:40:35

标签: android rx-java rx-android

我有一个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<Observable<Cursor>>展平为Observable<Cursor>

1 个答案:

答案 0 :(得分:10)

  

是否有更好的方法可以将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)
    }