Android rxJava - 包装在 Observable 中的空对象

Android rxJava - Null object wrapped in Observable

我有一个这样简单的用例:在远程源中查找一本书,如果它不存在,请创建它。 所以这是我用于 rxJava1 的方法:

public void handleBook(int id) {
    getBookById(id) 
        .flatMap(new Func1<Book, Observable<Book>> {
            @Override
            public Observable<Book> call(Book book) {
                if(book != null) // it exists
                ...
                else // it's null - it doesn't exist ...
            }
        }
}


public Observable<Book> getBookById(int id) {
    Book book = remoteSource.book(id)
    return Observable.just(book)
}

在这种情况下,如果对象 book 为空,则 Observable.just 调用会抛出异常。它明确检查空值。 回到 rxJava 1 我可以将 null 作为值传递给 Observable.just (或其他 accesoars),然后在 map 或 flatMap 运算符中我会检查我得到的值是否为 null(意味着结果不存在) (意思是我得到了一些结果)。

有了这个限制,我似乎不能再做这个检查了。我尝试返回 Observable.empty() 以防 book 对象为 null 但整个线程将 complete 并在返回值为 Observable.empty 时完成().

如果我需要的东西存在,我如何检查 rx 执行链并在之后分支执行链?

不要使用 Observable<Book> 作为 return 类型,而是使用 Single<Book>Single 类型发出对象或错误

注意: 现在我没有 IDE 所以代码可能会有一些编译器失败。我想你会很容易地修复它

public Single<Book> getBookById(int id) {
    return Single.create((e) => {
        Book book = remoteSource.book(id)
        if (book != null)
            e.emit(book);
        else
            e.fail();
    }
}

public void handleBook(int id) {
    getBookById(id) 
        .onErrorResume(e => createBook(...))
        ...
}

如前所述,我不确定确切的代码,但您可以像伪代码一样阅读它