我终于为任何感兴趣的人做了这样的事情:
1
首先,我做了一个抽象类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) {
...
}
});
2
这并不完全令人满意,因为我必须通过两次相同的测试。这可能会令人困惑,因为人们可以认为第二个(进入构造函数)应该或可能与第一个不同(我们在其上调用方法)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
这就是我解决这个问题的方式。任何关于更好设计的建议将不胜感激。