使用Retrofit 2重试请求
如何为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 2重试请求 的全部内容, 来源链接: utcz.com/qa/429347.html