You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用中如何使用Retrofit的.clone()方法实现请求重试机制

实现方案

核心逻辑说明

Retrofit的Call对象仅支持单次执行,首次请求失败后需要调用clone()方法生成新的Call实例再发起重试,同时需要增加重试次数限制避免无限重试。

代码修改步骤

1. 调整SplashScreen.java中的api_getSettings方法

直接替换原有方法代码即可,以下代码默认配置最多重试3次,可根据业务需求自行调整重试次数上限:

public void api_getSettings() {
    RestService restService = UrlController.createService(RestService.class);
    // 最大重试次数
    final int MAX_RETRY_TIMES = 3;
    // 当前已重试次数
    final AtomicInteger currentRetryCount = new AtomicInteger(0);
    try{
        Call<ResponseBody> myCall = restService.getSettings(UrlController.AddHeaders(this));
        myCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> responseObj) {
                try {
                    System.out.println("try2");
                    if (responseObj.isSuccessful()) {
                        Log.d("info settings Responce", "" + responseObj.toString());

                        JSONObject response = new JSONObject(responseObj.body().string());
                        if (response.getBoolean("success")) {
                            jsonObjectSetting = response.getJSONObject("data");
                            // 原有业务逻辑保持不变
                        } else {
                            Toast.makeText(activity, response.get("test message").toString(), Toast.LENGTH_SHORT).show();
                        }
                    }

                } catch (JSONException | IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                // 未达重试上限则重试
                if (currentRetryCount.getAndIncrement() < MAX_RETRY_TIMES) {
                    Toast.makeText(activity, "请求失败,正在重试第" + currentRetryCount.get() + "次", Toast.LENGTH_SHORT).show();
                    call.clone().enqueue(this);
                } else {
                    Toast.makeText(activity, "请求失败,请检查网络后重试", Toast.LENGTH_SHORT).show();
                    // 超过重试次数后的业务逻辑,比如退出应用等可在这里补充
                }
            }
        });
    } catch (ArrayIndexOutOfBoundsException e) {
        e.printStackTrace();
    }
}

可选优化(按需配置)

  • 可根据异常类型过滤重试场景:仅对UnknownHostException、Socket超时这类网络异常执行重试,业务错误、权限错误等异常直接终止重试
  • 可增加重试间隔:每次重试前等待1-3秒,避免短时间频繁请求触发服务端限流
  • 如需全局所有接口都支持重试,可将重试逻辑封装为统一的Callback基类,所有业务接口回调都继承该基类即可

内容的提问来源于stack exchange,提问作者Z_landbad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:48:03