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(...))
...
}
如前所述,我不确定确切的代码,但您可以像伪代码一样阅读它
我有一个这样简单的用例:在远程源中查找一本书,如果它不存在,请创建它。 所以这是我用于 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(...))
...
}
如前所述,我不确定确切的代码,但您可以像伪代码一样阅读它