当前位置: 首页 > 面试题库 >

使用Retrofit 2重试请求

皇甫聪
2023-03-14
问题内容

如何为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 */);

问题答案:

我终于对感兴趣的人做了这样的事情:

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.
    }
});

有了这个,我必须将一个标准传递CallbackenqueueWithRetry方法,它使我得以实现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个或更多请求并在中逐个检查响应,当检查最后一个请求时,使用我的执行。有人能帮我吗? 提前致谢。

  • wikisearch.spec.ts 接下来,我们订阅来自我们后端的任何传入连接。这使我们可以访问一个对象 ,它允许我们配置我们想要从我们的后端发送的响应,以及测试任何来自我们正在测试的服务的请求。 在我们的示例中,我们要验证SearchWiki的搜索方法是否向正确的URL发出GET请求。这是通过查看当我们的服务连接到我们的模拟后端时获得的请求对象来完成。分析request.url属性,我们可以看