使用RxJava retryWhen运算符时Kotlin类型不匹配

时间:2018-06-21 11:26:59

标签: kotlin rx-java rx-java2

我正在尝试创建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中收到此错误:

  

类型不匹配。必需:Publisher << out(??? .. ???)>>!找到:可观察<   空洞   !>!

1 个答案:

答案 0 :(得分:3)

问题是,您正在混合使用RxJava 1-Subject.asObservable和RxJava 2-{{​​3}}。

RxJava 2中Flowable的签名是:

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

因此retryWhen中的lambda应该返回扩展了Publisher的内容。相反,您返回的是Subject<Unit>,它会转换为Observable<Void>,因为显然您的Subject来自RxJava1。而且-由于RxJava版本的不同-显然它不会扩展{{1 }}。

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

主要问题是将RxJava 1和RxJava 2中的代码混合在一起,这永远都不好。