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。
解决方案
- 优先统一后端返回的JSON结构,所有数组元素使用相同的字段名,比如统一改成
tagw、conseil,从根源避免字段不匹配问题。 - 将
getString替换为更健壮的optString方法,找不到对应字段时会返回默认值,不会直接抛出异常中断逻辑。 - 循环边界使用
response.length()动态获取数组长度,不要写死固定值,避免数组越界。 - 调整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
相关产品推荐
相关产品推荐

