Volley请求多次执行问题:进度条到100后重复发送请求
问题原因与解决方案
核心问题分析
你遇到的多次请求问题,是两个原因叠加导致的:
- 重试策略配置错误+时机不对:你把重试次数设为
-1(Volley中-1代表无限重试),而且是在请求加入队列后才设置重试策略,导致配置不生效,请求用默认逻辑反复重试;再加上请求超时,Volley会不断重复发送请求。 - 进度条逻辑重复触发:进度条的进度更新回调(或你更新进度的逻辑)可能多次进入
progress == 100的分支,每次都会创建并发送新请求。
具体修复步骤
1. 修正重试策略的设置
调整重试策略的参数和设置顺序,确保配置生效:
// 1. 创建请求 JsonObjectRequest jsonRequest = new JsonObjectRequest (Request.Method.GET, url, null, response -> { try { String message = response.getString("message"); System.out.println(message); } catch (JSONException e) { e.printStackTrace(); } }, error -> { error.printStackTrace(); }); // 2. 先设置重试策略(必须在加入队列前) // 把重试次数改为有限值,比如0(不重试)或1-2次,同时延长超时时间避免误触发 jsonRequest.setRetryPolicy(new DefaultRetryPolicy( 3000, // 超时时间改为3秒 1, // 最多重试1次,可根据需求调整 DefaultRetryPolicy.DEFAULT_BACKOFF_MULT )); // 3. 加入队列(复用全局RequestQueue,不要每次新建) requestQueue.add(jsonRequest);
注意:不要每次请求都调用
Volley.newRequestQueue(),建议在Activity或Application中初始化一次全局RequestQueue并复用,避免资源浪费和重复请求风险。
2. 防止进度条重复触发请求
添加布尔标记位,确保请求只发送一次:
// 在Activity中定义标记位 private boolean isRequestSent = false; // 进度判断逻辑中加入标记检查 if(progressBar.getProgress() == 100 && !isRequestSent){ isRequestSent = true; // 标记为已发送,阻止后续重复进入 // 这里放置创建请求、设置重试策略、加入队列的代码 JsonObjectRequest jsonRequest = new JsonObjectRequest(...); jsonRequest.setRetryPolicy(...); requestQueue.add(jsonRequest); progressBar.setVisibility(View.INVISIBLE); CheckInBtn.setVisibility(View.INVISIBLE); }
3. 额外优化:处理超时错误
如果服务器响应较慢,1秒的超时时间过短,延长到3-5秒可以减少不必要的重试触发。
验证修复效果
完成上述修改后,请求只会在进度条第一次达到100时发送一次,即使出现超时,也只会按照你设置的重试次数执行,不会无限重复请求。
内容的提问来源于stack exchange,提问作者Kayes Fahim
相关产品推荐
相关产品推荐

