【问题标题】:RxJava : fromIterable is not emitting all the itemsRxJava:fromIterable 没有发出所有项目
【发布时间】:2019-06-27 13:26:29
【问题描述】:

我正在尝试使用 fromIterableflatMap 运算符的简单代码。我只是在我的代码中将长值流映射到Result 流。没有别的了

这是我的代码。 我的课是空的

    class Result {
        @Override
        public String toString() {
            return "result";
        }
    }

还有一个函数

    public Observable<Result> getResults(List<Long> requests) {
        return Observable.fromIterable(requests)
                .flatMap( aLong -> {
                    Result[] items = {new Result(), new Result()};
                    return Observable.fromIterable(Arrays.asList(items));
                });
    }       

我订阅这个如下

     List<Long> ids = new ArrayList<>(Arrays.asList(1L, 2L, 3L));

     getResults(ids)
    .subscribe(new DisposableObserver<Result>() {
        @Override
        public void onNext(Result item) {
            Log.d(TAG, "onNext: " + item);
        }

        @Override
        public void onComplete() {
            Log.d(TAG, "onCompleted: ");
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "onError: " + e.getMessage());
        }
    });     

我的预期输出是

    LOG: onNext: result
    LOG: onNext: result
    LOG: onNext: result
    LOG: onNext: result
    LOG: onNext: result
    LOG: onNext: result
    LOG: onCompleted:         

对于fromIterable 的每次发射,flatMap 预计会返回一个具有 2 个值的流,因此总共 6 次 onNext 然后是 onComplete

但我得到的是

    LOG: onNext: result
    LOG: onNext: result
    LOG: onCompleted:        

只有 2 次 onNext 被触发然后完成。剩下的 4 个值去哪了?

但奇怪的是,我在我的getResults函数中,在fromIterabledoOnNext上加了一个Log,如下

    public Observable<Result> getResults(List<Long> requests) {
        return Observable.fromIterable(requests)
                .doOnNext(i -> Log.d(TAG, "fromIterable emitted " + i))
                .flatMap(aLong -> {
                    Result[] items = {new Result(), new Result()};
                    return Observable.fromIterable(Arrays.asList(items));
                });
    }

现在它正在发出所有值!!!!这是输出

    LOG: fromIterable emitted 1
    LOG: onNext: result
    LOG: onNext: result
    LOG: fromIterable emitted 2
    LOG: onNext: result
    LOG: onNext: result
    LOG: fromIterable emitted 3
    LOG: onNext: result
    LOG: onNext: result
    LOG: onCompleted: 

这里发生了什么? onNext 对链进行了哪些更改以发出所有值?

【问题讨论】:

  • 您没有看到所有日志的可能原因是如果它们看起来太接近,日志会删除相似的消息。如果您记录独特的消息,则应显示所有 6 个 onNext。
  • @akarnokd Ohh.. 所以这似乎是一个日志记录问题。与 RxJava 无关吧?

标签: android rx-java rx-java2


【解决方案1】:

正如@akarnokd 所解释的,您在很短的时间内记录了类似的文本。在您的情况下,日志记录应该是唯一的,

List<Long> ids = new ArrayList<>(Arrays.asList(1L, 2L, 3L));

    getResults(ids)
            .subscribe(new DisposableObserver<Result>() {
                @Override
                public void onNext(Object item) {
                    Log.d(TAG, "onNext: called at " + System.currentTimeMillis());
                }

                @Override
                public void onComplete() {
                    Log.d(TAG, "onCompleted: ");
                }

                @Override
                public void onError(Throwable e) {
                    Log.e(TAG, "onError: " + e.getMessage());
                }
            });

或者在你的 observable 中类似地提及

  ...
  .doOnNext(i -> Log.d(TAG, "fromIterable emitted " + i))
  ...

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2021-04-10
    • 2015-09-05
    相关资源
    最近更新 更多