Volley 请求 JSONArray 如果为空则应被识别

Volley request JSONArray should be recognized if it was empty

我正在使用 Volley 从远程 PHP 脚本获取 JSON。 有时,JSON 数组为空。

这是我的代码:

StringRequest stringRequest=new StringRequest(Request.Method.GET, HI, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject jsonObject=new JSONObject(response);
                    JSONArray array=jsonObject.getJSONArray("data");



                    for (int i=0; i<array.length(); i++ ){
                        JSONObject ob=array.getJSONObject(i);
                        Notificacion listData=new Notificacion(ob.getString("id_notificacion")
                                ,ob.getString("texto"),
                                ob.getString("fecha"),
                                ob.getString("nombre"),
                                ob.getString("nombre")+" "+ob.getString("apellidos"),
                                ob.getString("profesor"),
                                ob.getString("tutor"),
                                ob.getString("estado"),
                                ob.getString("envia_tutor"),
                                ob.getString("envia_profesor")


                                );
                        list_data.add(listData);
                        spinner.setVisibility(View.GONE);
                    }
                    rv.setAdapter(adapter);
                } catch (JSONException e) {
                    e.printStackTrace();

                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("arry","array lengt error:"+error);
                Toast.makeText(getActivity(),
                        "No tienes notificaciones.", Toast.LENGTH_LONG)
                        .show();
                spinner.setVisibility(View.GONE);
            }
        });
        RequestQueue requestQueue= Volley.newRequestQueue(getActivity());
        requestQueue.add(stringRequest);

如果 JSON 数组为空,则我收到响应侦听器消息说 data[] 为空,但 Toast 未显示,微调器可见性也没有按预期消失。

当收到的 JSON 数组为空时,我应该如何更改我的代码以启动 Toast 并将微调器可见性设置为 GONE?

  • public void onResponse(String response)表示请求get response成功,解析成功,但是这个回调不代表数据值不为空!

  • public void onErrorResponse(VolleyError error)表示请求没有得到响应,可能是错误的http代码,或者请求成功但解析失败。

因此,如果您希望在请求成功但 data array 为空时执行某些操作,您应该在 public void onResponse(String response) 方法中添加一个逻辑来检查 successfully response但数据为空的情况

@Override
public void onResponse(String response) {
    try {
        JSONObject jsonObject = new JSONObject(response);
        JSONArray array = jsonObject.getJSONArray("data");


        if (array == null || array.length() == 0) {

            //data array is empty

            // add the logic you want

        } else {

            //data array not empty
            for (int i = 0; i < array.length(); i++) {
                JSONObject ob = array.getJSONObject(i);
                Notificacion listData = new Notificacion(ob.getString("id_notificacion")
                        , ob.getString("texto"),
                        ob.getString("fecha"),
                        ob.getString("nombre"),
                        ob.getString("nombre") + " " + ob.getString("apellidos"),
                        ob.getString("profesor"),
                        ob.getString("tutor"),
                        ob.getString("estado"),
                        ob.getString("envia_tutor"),
                        ob.getString("envia_profesor")


                );
                list_data.add(listData);
                spinner.setVisibility(View.GONE);
            }
            rv.setAdapter(adapter);
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
}

您应该像这样对代码进行一些更改:

StringRequest stringRequest=new StringRequest(Request.Method.GET, HI, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject jsonObject=new JSONObject(response);
                    JSONArray array=jsonObject.getJSONArray("data");

                         if (array.length()==0){
                        Toast.makeText(getActivity(),
                    "No tienes notificaciones.", Toast.LENGTH_LONG)
                    .show();
                     spinner.setVisibility(View.GONE);
                           }else{
                        for (int i=0; i<array.length(); i++ ){
                        JSONObject ob=array.getJSONObject(i);
                        Notificacion listData=new Notificacion(ob.getString("id_notificacion")
                                ,ob.getString("texto"),
                                ob.getString("fecha"),
                                ob.getString("nombre"),
                                ob.getString("nombre")+" "+ob.getString("apellidos"),
                                ob.getString("profesor"),
                                ob.getString("tutor"),
                                ob.getString("estado"),
                                ob.getString("envia_tutor"),
                                ob.getString("envia_profesor")

                                  );
                        list_data.add(listData);
                        spinner.setVisibility(View.VISIBLE);
                    }
                    rv.setAdapter(adapter);
                   }



                } catch (JSONException e) {
                    e.printStackTrace();
              spinner.setVisibility(View.GONE);
                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("arry","array lengt error:"+error);

                spinner.setVisibility(View.GONE);
            }
        });
        RequestQueue requestQueue= Volley.newRequestQueue(getActivity());
        requestQueue.add(stringRequest);