使用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.

}

});

有了这个,我必须将一个标准传递CallbackenqueueWithRetry方法,它使我得以实现onFailure(尽管在以前的方法中我也可以实现它)

所以这就是我解决问题的方式。任何关于更好设计的建议将不胜感激。

以上是 使用Retrofit 2重试请求 的全部内容, 来源链接: utcz.com/qa/429347.html

回到顶部