如何为Retrofit 2库发送的请求添加重试功能。就像是:
service.listItems().enqueue(new Callback<List<Item>>() {
@Override
public void onResponse(Response<List<Item>> response) {
...
}
@Override
public void onFailure(Throwable t) {
...
}
}).retryOnFailure(5 /* times */);
我终于对感兴趣的人做了这样的事情:
首先我做了一个抽象课 CallbackWithRetry
public abstract class CallbackWithRetry<T> implements Callback<T> {
private static final int TOTAL_RETRIES = 3;
private static final String TAG = CallbackWithRetry.class.getSimpleName();
private final Call<T> call;
private int retryCount = 0;
public CallbackWithRetry(Call<T> call) {
this.call = call;
}
@Override
public void onFailure(Throwable t) {
Log.e(TAG, t.getLocalizedMessage());
if (retryCount++ < TOTAL_RETRIES) {
Log.v(TAG, "Retrying... (" + retryCount + " out of " + TOTAL_RETRIES + ")");
retry();
}
}
private void retry() {
call.clone().enqueue(this);
}
}
使用此类,我可以执行以下操作:
serviceCall.enqueue(new CallbackWithRetry<List<Album>>(serviceCall) {
@Override
public void onResponse(Response<List<Album>> response) {
...
}
});
这并不完全令人满意,因为我必须serviceCall
两次通过相同的考试。这可能会引起混淆,因为人们可能认为第二个serviceCall
(进入的构造函数CallbackWithRetry
)应该或可能与第一个(我们enqueue
在其上调用方法)有所不同
所以我实现了一个辅助类CallUtils
:
public class CallUtils {
public static <T> void enqueueWithRetry(Call<T> call, final Callback<T> callback) {
call.enqueue(new CallbackWithRetry<T>(call) {
@Override
public void onResponse(Response<T> response) {
callback.onResponse(response);
}
@Override
public void onFailure(Throwable t) {
super.onFailure(t);
callback.onFailure(t);
}
});
}
}
我可以这样使用它:
CallUtils.enqueueWithRetry(serviceCall, new Callback<List<Album>>() {
@Override
public void onResponse(Response<List<Album>> response) {
...
}
@Override
public void onFailure(Throwable t) {
// Let the underlying method do the job of retrying.
}
});
有了这个,我必须将一个标准传递Callback
给enqueueWithRetry
方法,它使我得以实现onFailure
(尽管在以前的方法中我也可以实现它)
所以这就是我解决问题的方式。任何关于更好设计的建议将不胜感激。
问题内容: 我正在使用Retrofit集成我的Web服务,但我不明白如何使用POST请求将JSON对象发送到服务器。我目前陷入困境,这是我的代码: 活动:- PostInterface:- 要求JSON:- 响应JSON:- 问题答案: 在gradle中使用这些 使用这两个POJO类........ LoginData.class LoginResult.class 像这样使用API 使用这样的呼
目前,我正在捕捉异常并重新尝试维护一个计数器变量。
如何在基于网络的 HTTP 客户端中重试 HTTP 请求? 请考虑以下处理程序,如果收到 HTTP 响应代码 503,它将尝试在 1 秒后重试 HTTP 请求: 在本例中,当我写入通道时,管道中的其他处理程序会看到HttpObjects,但实际上不会再次执行HttpRequest——只接收到一个HttpResponse。 我认为在这种情况下我只是滥用了 Channel,我需要创建一个新的通道(表示
本文向大家介绍android Retrofit2+okHttp3使用总结,包括了android Retrofit2+okHttp3使用总结的使用技巧和注意事项,需要的朋友参考一下 使用前准备 Build.gradle文件配置 dependencies配置 网络框架搭建 服务创建类封装(HTTP): 使用说明: API_BASE_URL 用来配置api主地址 READ_TIMEOUT 用来配置读取超
我试图用相同的观察者观察两个请求。我的: 我的请求是使用Reformation 2构建的登录请求: 现在我想启动2个或更多请求并在中逐个检查响应,当检查最后一个请求时,使用我的执行。有人能帮我吗? 提前致谢。
我也得到了200的回复,但没有身体的数据