【问题标题】:Kotlin type mismatch when using RxJava retryWhen operator使用 RxJava retryWhen 运算符时 Kotlin 类型不匹配
【发布时间】:2018-06-21 11:26:59
【问题描述】:

我正在尝试创建 Observable,它会在网络连接建立时重试。

我已经创建了主题:

 private val retrySubject = PublishSubject.create<Unit>()()

我是这样使用它的:

  private fun publishNetworkReconnection() {
    compositeDisposable?.add(
       connectionHelper.observeConnection()
        .subscribe {connected: Boolean
          if(connected){
          retrySubject.onNext(null)
          }
        }
     )
  }

然后我尝试在我的 retryWhen 运算符中使用它:

   val disposable =
    Flowable.interval(0, UPDATE_INTERVAL, TimeUnit.SECONDS, Schedulers.io())
        .onBackpressureDrop()
        .flatMapCompletable {
          revocationRepository.sync(event.id)
        }
        .retryWhen { retryHandler -> retryHandler.flatMap({ nothing -> retrySubject.asObservable() }) }
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ }, { Timber.e(it, "Unable to sync blacklist") })
    compositeDisposable?.add(disposable)
  }

这种情况下如何正确使用?

我在 Android Studio 中收到此错误:

类型不匹配。必需:发布者>!发现:可观察的!

【问题讨论】:

  • 你使用 RxJava 1 还是 2?一方面你有Flowable,另一方面,Subject.asObservable 在 RxJava 1 中。你使用这两个版本吗?连这段代码都很难编译
  • @michalbrz 我在关注这个例子android.jlelse.eu/…

标签: kotlin rx-java rx-java2


【解决方案1】:

问题是,您正在混合使用 RxJava 1 - Subject.asObservable 和 RxJava 2 - Flowable

来自 RxJava 2 的retryWhen 的签名是:

Flowable<T> retryWhen(Function<? super Flowable<Throwable>,? extends Publisher<?>> handler)

所以 retryWhen 内的 lambda 应该返回扩展 Publisher 的东西。相反,您返回的是 Subject&lt;Unit&gt;,它被转换为 Observable&lt;Void&gt;,因为显然您的 Subject 来自 RxJava 1。而且 - 由于 RxJava 版本不同 - 显然它不会扩展 Publisher

所以错误消息是正确的,retryWhen 期望来自 RxJava 2Publisher,但您提供来自 RxJava 1Obervable。您没有注意到不同的包,因为它们不包含在消息中。

主要问题是混合来自 RxJava 1 和 RxJava 2 的代码,这从来都不好。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多