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

Android Studio中按钮单次点击触发两次HTTP请求问题排查

问题:点击按钮一次却触发两次HTTP请求(Logcat仅一条日志)

界面上有一个按钮,预期点击时执行一次HTTP请求。通过Network Inspector查看网络流量时发现触发了两次HTTP请求(仅点击一次),但Logcat中只有一条日志记录。相关代码如下:

btnEkle = findViewById(R.id.btnShippingEkle);
btnEkle.setOnClickListener(v -> {
    btnEkle.setVisibility(View.GONE);
    layAnim.setVisibility(View.VISIBLE);
    imgAnim.startAnimation(AnimationUtils.loadAnimation(this, R.anim.dairesel) );

    String plaka = sbtBilgi.getString("plaka"," ");
    String tc_no = sbtBilgi.getString("tc_no"," ");
    String aciklama = edtNot.getText().toString();

    String urlAdres = "";
    try {
        urlAdres = String.format("%smobil.aspx?req=YUKLE&id=%s&plaka=%s&tc=%s&kim=%s&lat=%s&lon=%s&not=%s", Referans.siteURL, okunan, plaka, tc_no, Referans.kullanici_id, lat, lon, URLEncoder.encode(aciklama, "utf-8"));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    String finalUrlAdres = urlAdres;
    new Handler().postDelayed(() -> {
        RequestQueue qYukle = Volley.newRequestQueue(getApplicationContext());
        StringRequest getRequest = new StringRequest(Request.Method.GET, finalUrlAdres, response -> {
            Log.e("***** YUKLE : ", finalUrlAdres);
            YukListesiOlustur();
        }, null);
        qYukle.add(getRequest);
    }, 100);
});

可能的原因及解决方案

1. Volley默认重试机制导致重复请求

Volley框架默认会在请求超时、连接失败等场景下自动重试请求。重试的请求不会触发onResponse回调(只有最终成功的请求才会打日志),所以Logcat只显示一条记录,但Network Inspector能看到两次请求。

解决方法:给请求设置重试策略,禁用自动重试:

StringRequest getRequest = new StringRequest(Request.Method.GET, finalUrlAdres, response -> {
    Log.e("***** YUKLE : ", finalUrlAdres);
    YukListesiOlustur();
}, null);
// 禁用重试
getRequest.setRetryPolicy(new DefaultRetryPolicy(
        5000, // 自定义超时时间,比如5秒
        0, // 重试次数设为0
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT
));
qYukle.add(getRequest);

2. 服务器返回30x重定向

如果服务器返回301/302重定向响应,Network Inspector会显示原始请求和重定向后的目标请求,看起来是两次请求,但实际上是一次业务请求的跳转。Volley会自动处理重定向,只在最终响应时触发onResponse,所以日志仅一条。

验证方法:查看Network Inspector中两次请求的状态码,如果是30开头,属于正常重定向,无需处理;如果都是200,则是重复发起了请求。

3. 按钮点击事件被重复绑定

检查代码中是否在多个生命周期方法(比如onResume、onCreateView)中重复调用了btnEkle.setOnClickListener,导致点击一次触发两次请求逻辑。

解决方法:确保整个页面生命周期内,只绑定一次点击事件(比如仅在onCreate中绑定)。

4. 按钮意外重复触发

虽然你说只点击了一次,但可以再加一步禁用按钮,彻底避免误触导致的重复请求:

btnEkle.setOnClickListener(v -> {
    // 点击后立即禁用按钮
    btnEkle.setEnabled(false);
    btnEkle.setVisibility(View.GONE);
    // ... 后续逻辑
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:15:33