![](/img/trans.png)
[英]RxJava's Observable.create vs Observable.just(1).flatMap
[英]RxJava: After Observable.just it still calls Observable.empty()
我想從文件名中檢索特定城市。 如果找不到該城市,則返回Observable.empty();。 否則我返回Observable.just(city); 這是代碼:
public void onAddButtonClick(String cityName) {
Subscription subscription = repository.getCity(cityName)
.subscribeOn(backgroundThread)
.flatMap(city -> repository.saveCityToDb(city))
.observeOn(mainThread)
.subscribe(
city -> view.cityExists(),
throwable -> view.showCouldNotFindCity(),
() -> view.showCouldNotFindCity()
);
subscriptions.add(subscription);
}
和方法getCity()
:
public Observable<City> getCity(String cityName){
return Observable.defer(() -> {
try {
InputStream is = assetManager.open(FILE_NAME);
Scanner scanner = new Scanner(is);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.toLowerCase().contains(cityName.toLowerCase())) {
String[] cityParams = line.split("\t");
City city = new City();
city.setId(Long.parseLong(cityParams[0]));
city.setName(cityParams[1]);
return Observable.just(city);
}
}
} catch (IOException e) {
return Observable.error(e);
}
return Observable.empty();
});
}
但是問題是找到城市並返回Observable.just(city);
它return Observable.empty();
我不知道為什么 因此無論如何都會調用代碼() -> view.showCouldNotFindCity()
。
問題是您在onCompleted處理程序中調用了此()-> view.showCouldNotFindCity()。 如果看一下RxJava中的just()方法,您會看到它首先在訂閱者上調用onNext,然后再調用onCompleted方法。 因此,當找到城市時,將調用city-> view.cityExists(),然后在()-> view.showCouldNotFindCity()之后立即調用。
如果在您的getCity方法中找不到城市,我只會拋出一個錯誤。 由於您的onError已經調用了所需的()-> view.showCouldNotFindCity()方法,並將其從onCompleted處理程序中刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.