【问题标题】:RxJava2 Convert Flowable to SingleRxJava2 将 Flowable 转换为 Single
【发布时间】:2021-02-12 23:41:40
【问题描述】:

如何将 Flowable 转换为 Single?或者,如果有另一种方法可以让它在第一个响应之后停止发射,这也是感兴趣的。

我试过了,但它似乎不起作用:

  disposables.add(
        repository.getAllSomethings()
           .subscribeOn(SchedulerProvider.getInstance().computation())
           .observeOn(SchedulerProvider.getInstance().ui())
           .toSingle()
           .subscribeWith(object : DisposableSingleObserver<List<Something>>() {
                override fun onSuccess(t: List<Something>) {
                }

                override fun onError(e: Throwable) {
                }
            })

getAllSomethings() 返回Flowable&lt;List&lt;Something&gt;&gt;

在上面的代码中,.subscribeWith() 用红色下划线表示:

Type parameter bound for E in 
fun <E : SingleObserver<in Flowable<List<Something>!>!>!> subscribeWith(observer: E!): E!
is not satisfied: inferred type  ! is not a subtype of SingleObserver<in Flowable<List<Something>!>!>!

【问题讨论】:

  • 我建议您熟悉available operators - 这将为您节省大量时间。
  • 好吧,我猜你是说我应该使用单一(T defaultItem)?但我不想返回一个 defaultItem。它应该发出单个值或超时并调用 onError。
  • 继续查看可用的运算符。
  • 好的,我明白了。或者至少它似乎适用于 firstOrError()。谢谢你的建议!你想回答还是我应该回答?我实际上记得你以前的帖子,你想让我做答案,因为你不关心分数。
  • 是的,我找到了它,但在你的帮助下(你知道答案)。我觉得有必要问,但是我认为这意味着如果你再次这样回答,这就是你想要的。再次感谢。

标签: android rx-java2


【解决方案1】:

好的,感谢@akarnokd,我找到了答案,正如您在 cmets 中看到的那样。

教我如何钓鱼而不是给我他建议看这里的直接答案:http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html(我真的应该首先这样做!)。

在那里我找到了firstOrError(),它解决了我的问题。

即使我调用toSingle() 的对象是一个Flowable,IDE 也没有抱怨。然而看看上面的链接,toSingle() 甚至不是一个有效的选项!

【讨论】:

    【解决方案2】:

    在我的情况下,我实际上有一个 Flowable 并且想要它的好处(即背压),但我仍然想返回一个 Single,例如Single&lt;List&lt;String&gt;&gt;。就我而言,我使用的是 Android WorkManager 的 RxWorker,它希望我的函数返回 Single&lt;Result&gt;,而不是 Flowable。

    在这种情况下,

    val flowable = Flowable.just("my flowable")
    return flowable.toList() // type: Single<List<String>>
    

    或者如果您想返回一个特定的值,因为您不关心可流动的输出:

    return flowable.toList().map {} // returns unit
    return flowable.toList().map { "Hello" } // returns String
    return flowable.toList().map { Result.success() } // returns Result
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 2020-05-19
      • 1970-01-01
      相关资源
      最近更新 更多