繁体   English   中英

RxJava:在Observable.just之后,它仍然调用Observable.empty()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM