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

Volley请求多次执行问题:进度条到100后重复发送请求

问题原因与解决方案

核心问题分析

你遇到的多次请求问题,是两个原因叠加导致的:

  1. 重试策略配置错误+时机不对:你把重试次数设为-1(Volley中-1代表无限重试),而且是在请求加入队列后才设置重试策略,导致配置不生效,请求用默认逻辑反复重试;再加上请求超时,Volley会不断重复发送请求。
  2. 进度条逻辑重复触发:进度条的进度更新回调(或你更新进度的逻辑)可能多次进入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:24:15