我正在尝试创建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(??? .. ???)>>!找到:可观察< 空洞 !>!
答案 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中的代码混合在一起,这永远都不好。