JavaRxJava:带有条件的代码
我搜索城市,如果它不存在,我想做一个与城市存在时不同的动作
public void onAddButtonClick(String cityName) {
Subscription subscription = repository.getCity(cityName)
.filter(city -> city != null)
.subscribeOn(backgroundThread)
.flatMap(city -> repository.saveCityToDb(city))
.observeOn(mainThread)
.subscribe(city -> view.cityExists());
subscriptions.add(subscription);
}
getCity()
方法:
public Observable<City> getCity(String name){
return fileRepository.getCityFromFile(name);
}
和getCityFromFile()
public Observable<City> getCityFromFile(String cityName){
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.fromCallable(() -> city);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return Observable.fromCallable(() -> null);
}
因此,当找不到城市时,我想向用户发出警报,当找到城市时,我想进一步(将其保存到DB,打开主屏幕等)。我使用了操作符filter(),但它并不是我想要的,如果city==null,它就不会更进一步。 你能给我一些更好的建议吗
# 1 楼答案
这取决于你如何设计你的代码
如果你搜索一个城市,但没有找到它,可能会返回一个
Observable.empty
。或者返回一个Observable.error
(如果是错误情况)。然后,如果出现空/错误Observable
,可以使用另一个Observable
例如:
如果你返回一个可观察的。错误,您可以使用
onErrorResumeNext
而不是switchIfEmpty
但是为了正确操作,我认为应该避免在
getCityFromFile
中发出null
值。用empty
或error
代替# 2 楼答案
您可以使用
Observable.error()
抛出一个错误,并在Subsriber
的onError()
方法中捕获它: