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

