Android rxJava - 包含在Observable

时间:2017-07-10 12:09:58

标签: android rx-java rx-java2

我有一个简单的用例:在Remote源中查找Book,如果它不存在,则创建它。 所以这是我用来处理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为null,则Observable.just调用将引发异常。它显式检查空值。 回到rxJava 1我可以将null作为值传递给Observable.just(或其他的加速器),然后在map或flatMap运算符中我检查我得到的值是否为null(意味着结果不存在)或不是(意思是我得到了一些结果)。

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

如果我需要的东西在那里并且之后分支执行链,我如何签入rx执行链?

1 个答案:

答案 0 :(得分:1)

不使用Observable<Book>作为返回类型,而是使用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(...))
        ...
}

就像之前所说的那样,我不确定确切的代码,但你可以把它读作好像是伪代码