我有以下代码
public Retrofit provideRetorift(){
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
return new Retrofit.Builder()
.baseUrl(Constant.BASE_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create())
.build();
}
api如下呼叫
apiService().getApiRespo()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.retry(5)
.doOnNext(new Consumer<User>() {
@Override
public void accept(User user) throws Exception {
}
})
.subscribe(new Observer<User>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(User user) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
我已经添加了好的http超时以及rx java重试仍然在我之间连接互联网时它将不会重试。只有在第一次上网时才能正常工作。
我是Android的新手可以任何人帮助我在app尝试调用api之间的互联网连接时自动重试
答案 0 :(得分:0)
也许这篇文章对您有用。
此代码轮询具有退避功能的服务器,直到接收到不同于204的代码。您应该使用retryWhen而不是repeatWhen,因为您想在出错时重试请求。
fun pollServerWithBackoff(videoId: String, maxAttempts: Int, delay: Int): Flowable<Response<ResponseBody>> {
return api.download(videoId)
.subscribeOn(Schedulers.io())
.repeatWhen {
it
.zipWith(Flowable.range(1, maxAttempts),
BiFunction { _: Any?, attempt: Int -> attempt })
.flatMap {
Flowable.timer((it * delay).toLong(), TimeUnit.SECONDS);
}
}
.takeUntil({
it.code() != 204
})
.filter {
it.code() != 204
}
.map{
if(it.code() in 200..300)
it
else
throw IOException(it.errorBody()?.toString() ?: "")
}
}