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

Android使用Volley请求JSON数组迭代时出现空Toast与空TextView问题

问题原因
  • JSON结构不统一:返回的JSON数组第一个元素的字段名为tagw2、conseil2,第二个元素的字段名为tagw、conseil,遍历到第一个元素时调用getString("tagw")找不到对应值,直接抛出JSONException进入catch块,后续赋值、Toast逻辑都不会执行。由于是请求成功后的解析异常,不会触发Volley的onErrorResponse回调,所以不会出现“something wrong”提示。
  • 循环边界设置错误:你的JSON数组只有2个元素,但是for循环写死了i<4,就算字段名统一,遍历到索引2、3时也会出现数组越界异常。
  • Toast调用时机错误:第一次弹出Toast是在给GiveTagw赋值之前,此时GiveTagw还是初始空字符串,就算后续逻辑正常也会先弹出空Toast。
解决方案
  1. 优先统一后端返回的JSON结构,所有数组元素使用相同的字段名,比如统一改成tagw、conseil,从根源避免字段不匹配问题。
  2. 将getString替换为更健壮的optString方法,找不到对应字段时会返回默认值,不会直接抛出异常中断逻辑。
  3. 循环边界使用response.length()动态获取数组长度,不要写死固定值,避免数组越界。
  4. 调整Toast调用时机,在拿到字段值之后再弹出提示。

修改后的代码示例:

JsonArrayRequest request=new JsonArrayRequest(Request.Method.GET,url, null,new Response.Listener<JSONArray>() {
    @Override
    public void onResponse(JSONArray response) {
        String GiveTagw = "";
        String GiveConseil= "";
        try {
            // 动态获取数组长度作为循环边界
            for (int i=0;i<response.length();i++)
            {
                JSONObject Info = response.getJSONObject(i);
                // 兼容新旧字段,优先匹配tagw,没有就匹配tagw2
                if (Info.has("tagw")) {
                    GiveTagw = Info.optString("tagw", "无标签");
                } else if (Info.has("tagw2")) {
                    GiveTagw = Info.optString("tagw2", "无标签");
                }
                // 拿到值之后再弹Toast
                Toast.makeText(getApplicationContext(), GiveTagw, Toast.LENGTH_SHORT).show();

                if (Info.has("conseil")) {
                    GiveConseil = Info.optString("conseil", "无建议");
                } else if (Info.has("conseil2")) {
                    GiveConseil = Info.optString("conseil2", "无建议");
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), "数据解析失败", Toast.LENGTH_SHORT).show();
        }
        mTextViewResult.setText(GiveTagw);
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        mTextViewResult.setText("something wrong");
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 20:15:02