【问题标题】:RxJava2 toList() never emitsRxJava2 toList() 从不发出
【发布时间】:2017-11-16 10:21:02
【问题描述】:

所以我有以下 Disposable 不起作用。我正在使用 Room 将表中的所有行作为列表获取,将它们中的每一个映射到某个东西并创建一个列表,然后它不会从那里继续。

storedSuggestionDao
    .getSuggestionsOrderByType() //Flowable
    .doOnNext(storedSuggestions -> Timber.e("storedSuggestions: " + storedSuggestions)) //this work
    .flatMapIterable(storedSuggestions -> storedSuggestions)
    .map(Selection::create) ))
    .doOnNext(selection -> Timber.e("Selection: " + selection)) // works
    .toList()
    .toObservable() // nothing works after this...
    .doOnNext(selections -> Timber.d("selections: " + selections))
    .map(SuggestionUiModel::create)
    .doOnNext(suggestionUiModel -> Timber.d("suggestionUiModel: " + suggestionUiModel))
    .subscribe();

【问题讨论】:

  • 为什么需要使用.toObservable()
  • 因为这是在另一个流中,它从 ui 获取字符串等,并检查是否需要获取存储的建议或访问网络。但即使我不做 toObservable(),它仍然不会在 toList() 之后发出。那时它是一个 Single 所以它应该在 onSuccess() 中返回一些东西

标签: android rx-java2 android-room


【解决方案1】:

来自第三方的这些类型的数据源通常是无限源,但toList() 需要有限源。我猜您想处理 storedSuggestions 的集合并将其保存在一起。您可以通过内部转换来实现这一点:

storedSuggestionDao
.getSuggestionsOrderByType() //Flowable
.doOnNext(storedSuggestions -> Timber.e("storedSuggestions: " + storedSuggestions)) //this work
// -------------------------------------
.flatMapSingle(storedSuggestions -> 
    Flowable.fromIterable(storedSuggestions)
    .map(Selection::create)
    .doOnNext(selection -> Timber.e("Selection: " + selection))
    .toList()
)
// -------------------------------------
.doOnNext(selections -> Timber.d("selections: " + selections))
.map(SuggestionUiModel::create)
.doOnNext(suggestionUiModel -> Timber.d("suggestionUiModel: " + suggestionUiModel))
.subscribe();

【讨论】:

  • 所以这行得通 :) Room 提供了无限的数据流(所以当数据库中发生更改时,您可以获取它们),这导致了这个问题,因为我“习惯于”使用有限流(即网络呼叫等)
【解决方案2】:

我认为在你的情况下你不需要调用 .toObserable()

应该是这样的

storedSuggestionDao
.getSuggestionsOrderByType() //Flowable
.doOnNext(storedSuggestions -> Timber.e("storedSuggestions: " + storedSuggestions)) //this work
.flatMapIterable(storedSuggestions -> storedSuggestions)
.map(Selection::create) ))
.doOnNext(selection -> Timber.e("Selection: " + selection)) // works
.toList() // you don't have to call .toObserable()
.map(SuggestionUiModel::create)
.subscribe();

【讨论】:

    【解决方案3】:

    问题是 storedSuggestionDao.getSuggestionsOrderByType() //Flowable

    是热流。 toList 仍在等待上游完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多