在Rxjava2中使用retryWhen来重新进行网络请求失败

wujushan 2017-12-28 08:53:23
使用Rxjava2+ Retrofit 进行网络请求,在请求失败之后,使用retryWhen实现重新请求(如下面代码)。但发现没有实现预想的功能:

class TestRetryWhenHeartBeatException : Function<Observable<out Throwable>, ObservableSource<*>> {
companion object {
private val DELAY: Long = 6
private val TAG:String = TestRetryWhenHeartBeatException::class.java.simpleName
}
override fun apply(t: Observable<out Throwable>): ObservableSource<*> {
logd(TAG,"retry when")
return t.flatMap { Observable.timer(DELAY, TimeUnit.SECONDS) }
}
}

mHeartBeatDisposable  =
Observable.interval(5,TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
// .repeatWhen(RepeatWhenHeartBeatCompleted())
.retryWhen(TestRetryWhenHeartBeatException())
.flatMap {
if (TaskManager.mIdle) {
logd(TAG, "heartbeat")
mNetWorkApi.heartBeat(UrlManager.HEARTBEAT_URL)
} else {
Observable.create { emitter ->
//emit a HttpResult with no data
emitter.onNext(nullHeartBeat)
}
}
}
.subscribe({
logd(TAG, "lost server false")
}, { e ->
loge(TAG, e.message)
loge(TAG, "lost server true")
}, {})


...全文
1690 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
白鹭飞 2018-04-27
  • 打赏
  • 举报
回复
我也跟你的情况一样,直接被最后的Error给捕获了这里进不来
wujushan 2017-12-30
  • 打赏
  • 举报
回复
没人也遇到这种情况吗?
wujushan 2017-12-29
  • 打赏
  • 举报
回复
以上的代码在onError中直接回调,没有重新拉取网络请求。
moonFY 2017-12-29
  • 打赏
  • 举报
回复

.retryWhen(observable1 -> observable1.flatMap((Func1<Throwable, Observable<?>>) throwable -> {
                    if (retryCount > 0) {
                        retryCount--;
                        return Observable.timer(2000, TimeUnit.MILLISECONDS);
                    }
                    return Observable.error((Throwable) throwable);
                }))
这是Java 的代码,对比着改吧

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧