>

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 배열이 비어있을 때 토스트를 시작하고 스피너 가시성을 GONE으로 설정하려면 코드를 어떻게 변경해야합니까?


  • 답변 # 1

    다음과 같이 코드를 변경해야합니다 :

    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);
    
    

  • 답변 # 2

    public void onResponse(String 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();
        }
    }
    
    

  • 이전 angular - 대상 구성 요소의 URL에 표시되지 않고 한 구성 요소에서 다른 구성 요소로 json을 보냅니다
  • 다음 java - BigDecimal 요청 get 매개 변수 (문자열을 BigDecimal로 변환 할 수 없음)