2014-12-17 4 views
0

안드로이드 json에 관한 질문이 많습니다. 그러나 많은 것을 읽은 후에 필요한 답변을 찾을 수 없습니다. 나랑 벗겨주세요.안드로이드 JSON 요청 채우기 배열

이 튜토리얼 하였다 갖는

www.androidhive.info/2014/09/android-json-parsing-using-volley/을

저자 직접 텍스트 뷰를 설정하여 콜백 데이터를 사용

콜백 내에서. 내가하고 싶은 것은 배열로부터 요청을 받아서 배열을 채운 다음 그 배열을 다른 곳에서 사용할 수있게하는 것입니다 (응답 수신기는 익명의 내부 클래스이므로 얻을 방법을 알 수 없습니다 이 데이터는, 청취자 내부 배열에 할당하려는 시도는 무익한 증명했다 난 아직 초보자 해요로

덕분에, 나와 함께 곰하시기 바랍니다

청취자 :

JsonArrayRequest req = new JsonArrayRequest(urlJsonArry, 
     new Response.Listener<JSONArray>() { 
      @Override 
      public void onResponse(JSONArray response) { 
       Log.d(TAG, response.toString()); 

       try { 
        // Parsing json array response 
        // loop through each json object 
        jsonResponse = ""; 
        for (int i = 0; i < response.length(); i++) { 

         JSONObject person = (JSONObject) response 
           .get(i); 

         String name = person.getString("name"); 
         String email = person.getString("email"); 
         JSONObject phone = person 
           .getJSONObject("phone"); 
         String home = phone.getString("home"); 
         String mobile = phone.getString("mobile"); 

         jsonResponse += "Name: " + name + "\n\n"; 
         jsonResponse += "Email: " + email + "\n\n"; 
         jsonResponse += "Home: " + home + "\n\n"; 
         jsonResponse += "Mobile: " + mobile + "\n\n\n"; 

        } 

        txtResponse.setText(jsonResponse); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
        Toast.makeText(getApplicationContext(), 
          "Error: " + e.getMessage(), 
          Toast.LENGTH_LONG).show(); 
       } 

       hidepDialog(); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.d(TAG, "Error: " + error.getMessage()); 
       Toast.makeText(getApplicationContext(), 
         error.getMessage(), Toast.LENGTH_SHORT).show(); 
       hidepDialog(); 
      } 
     }); 

을.. 편집 : 아래 코드는 내가 가지고있는 문제를 설명합니다. 아마도이 부분은 오해 또는 오용으로 인한 것일 수도 있습니다.

private void makeJsonArrayRequest(String url){ 

    //ONLY WAY TO ACCESS INSIDE LISTENER IS TO MAKE FINAL 

    final ArrayList<String> string = new ArrayList<>(); 

    showpDialog(); 
    JsonArrayRequest req = new JsonArrayRequest(
      url, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        try { 
         for (int i = 0; i < response.length(); i++) { 
          JSONObject field = (JSONObject) response.get(i); 
          string.add(i, field.getString("title")); 

          //THIS PRINTS OUT ALL MY TITLES CORRECTLY, SHOWING THAT 
          //THE STRINGS ARRAY IS POPULATED IN THIS SCOPE 

          Log.d(AppController.TAG, string.get(i)); 
         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
         Toast.makeText(context, 
           "Error: " + e.getMessage(), 
           Toast.LENGTH_LONG).show(); 
        } 
        hidepDialog(); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d(AppController.TAG, "Error: " + error.getMessage()); 
        Toast.makeText(context, 
        error.getMessage(), Toast.LENGTH_SHORT).show(); 
       hidepDialog(); 
       } 
      } 
    ); 

    AppController.getInstance().addToRequestQueue(req); 

    //THIS CAUSES AN OUT OF BOUNDS EXCEPTION, AS IT THINKS THE ARRAY HAS NOT BEEN POPULATED 

    Log.d(AppController.TAG, string.get(3)); 
} 
+0

그것이 실패? 문제의 JSON을 게시 할 수 있습니까? – browep

+0

편집을 참조하십시오. – Jixan

답변

0

문제는 OnResponse (..) 내에서 실제 문자열의 복사본으로 변수 문자열을 사용하고 있다고 생각합니다. 이 변수에 정적 추가

시도 : 무엇을 줄

final static ArrayList<String> string = new ArrayList<>();