为什么在使用toList时没有调用onNext?

时间:2016-10-04 00:37:53

标签: android rx-java rx-android sqlbrite

使用RxJava onNext运算符时,我遇到了toList未被调用的问题。在toList被调用之前,一切都与我期望的一模一样。我读过的内容hereherehere似乎表明onCompleted未被调用的问题,但我还是RxJava的新手,所以我不确定我需要调用它才能使其工作。

最令人困惑的是,我试图从Google's Android Architecture关注的架构似乎没有调用onCompleted,而且它的工作正常。

Subscription subscription = mDataSource
        // Get Observable<List<Location>> from SQLBrite database
        .getLocations()
        // Convert to Location object
        .flatMap(new Func1<List<Location>, Observable<Location>>() {
            @Override
            public Observable<Location> call(List<Location> locations) {
                return Observable.from(locations);
            }
        })
        // Filter here
        .filter(new Func1<Location, Boolean>() {
            @Override
            public Boolean call(Location location) {
                return mPreferences.getUsesCustomLocations() || location.getId().length() <= 2;
            }
        })
        // Convert Location object to String
        .map(new Func1<Location, String>() {
            @Override
            public String call(Location location) {
                return location.getTitle();
            }
        })
        // Convert to Observable<List<String>, however using toList()
        // causes onNext() to never get called
        .toList()
        .subscribeOn(mSchedulerProvider.computation())
        .observeOn(mSchedulerProvider.ui())
        .subscribe(new Observer<List<String>>() {
            @Override
            public void onCompleted() {
            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            @Override
            public void onNext(List<String> locations) {
                processLocations(locations);
            }
        });
    mSubscriptions.add(subscription);

1 个答案:

答案 0 :(得分:1)

调用toList()后,您只会获得一个onNext(),即源观察时调用onComplete()

您看到的行为的原因是SQLBrite,它会在每次更改时向您发送数据。 这意味着它是一个无休止的流,所以它最终永远不会调用onComplete()。