我已经尝试过用RxJava进行改装的https请求
当网络不可用时,我想这样处理。1、检查网络状态。2、如果网络可用,请重试请求3,如果网络不可用,则在此之后没有重试->,请侦听网络状态,当网络恢复时,然后重试请求。
我想我们应该使用retryWhen()
操作符,但我不知道这么做有多热
需要帮助才能找到好的解决方案
发布于 2019-11-25 09:14:00
你应该像你说的那样使用retryWhen
操作符。
http://reactivex.io/documentation/operators/retry.html
见retryWhen
节下的RxKotlin
。
RetryWhen
运算符“重新订阅”当内部可观测到的发出一个项目(可观察的onNext或单个的onSuccess被调用)或只是不重试和通过可抛出的下游当onError
调用。
以上是我的措辞,来自医生的确切措辞如下:
retryWhen操作符类似于重试,但通过将Throwable从onError通知传递给生成第二个可观察的函数来决定是否重新订阅和镜像可观察的源,并观察其结果以确定要做什么。如果该结果是已发出的项,retryWhen将重新订阅并镜像源和进程;如果该结果是onError通知,则retryWhen将此通知传递给它的观察者并终止。
假设您有以下改进接口。
interface Api {
@GET("/api")
fun request(): Single<String>
}
在retry块中,您将得到一个可流的throwable (它将主要是从您的改造接口抛出的HttpException
),因此您应该在这个可流通性上使用flatMap
操作符,因为当网络仍然不可用时,您必须通过可抛出的下游。
ApiClient.instance.request()
.retryWhen { flowable: Flowable<Throwable> ->
flowable.flatMap { throwable ->
// check network status here
if (available) return@flatMap Flowable.just<Boolean>(true)
return@flatMap Flowable.error<Boolean>(throwable)
}
}
.subscribe({ response -> /* deal with success */}, { error -> /* deal with error */})
请注意,您必须匹配重试案例和抛出案例的类型(本例中为Flowable<Boolean>
)。只要当您想要重试时发出一个项,当您不想重试时发出一个错误,那么使用哪种类型并不重要。
发布于 2019-11-25 07:06:32
使用rxJava和Retrofit处理网络错误非常容易,因为它只是在onError方法中抛出一个RetrofitError:
@Override
public void onError(Throwable e) {
if (e instanceof RetrofitError) {
if (((RetrofitError) e).isNetworkError()) {
//handle network error
} else {
//handle error message from server
}
}
}
https://stackoverflow.com/questions/59026629
复制相似问题