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
相关产品推荐
相关产品推荐

