使用RxJava的retryWhen操作符时,Kotlin类型不匹配

5

我正在尝试创建一个Observable,当网络连接建立时将进行retryWhen操作。

我已经创建了一个subject:

 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 (???..???) >>!找到:Observable < Void ! >!


1
你使用RxJava 1还是2?一方面有Flowable,另一方面有Subject.asObservable,它在RxJava 1中。你同时使用这两个版本吗?即使编译此代码也很困难。 - michalbrz
@michalbrz 我正在跟随这个例子 https://android.jlelse.eu/rx-grokking-retrywhen-and-repeatwhen-on-android-development-examples-af5c3ed0872b - K.Os
1个回答

5
问题在于,你混用了 RxJava 1 - Subject.asObservable 和 RxJava 2 - Flowable
RxJava 2 中 retryWhen 的签名为:
Flowable<T> retryWhen(Function<? super Flowable<Throwable>,? extends Publisher<?>> handler)

retryWhen中,lambda应该返回一个扩展了Publisher的内容。然而,你却返回了Subject<Unit>,它被转换成了Observable<Void>,因为显然你的Subject来自RxJava 1。由于RxJava版本的差异,它显然没有扩展Publisher

因此,错误信息是正确的,retryWhen希望从RxJava 2中得到Publisher,但你给出了RxJava 1中的Obervable。你没有注意到不同的包,因为它们没有包含在消息中。

主要问题是混合使用RxJava 1和RxJava 2的代码,这是不好的。


1
在 RxJava 2 中,retryWhen 的正确表达式是什么? - Vadim Kotov
@anshul 我不确定这是否对你有帮助,这是我正在使用的代码 - https://gist.github.com/vkotovv/a75490988e4c544d108b5e738922988f - Vadim Kotov
@VadimKotov 不,它没有帮助。这是我的确切问题 https://stackoverflow.com/questions/59856216/retrywhen-is-giving-some-issues-when-using-with-single - anshul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接