的Android JSON请求填充阵列

问题描述 投票:0回答:1

我按照这个教程。

笔者在回调中设置TextView的直接使用回调的数据。我想这样做是填充我是从我的请求得到响应的数组,然后就可以在其他地方使用该数组(作为响应监听器是一个匿名内部类,我无法弄清楚如何获得从它的数据;任何要分配给听者内部的阵列尝试已经证明徒劳无功。

谢谢你,请原谅,因为我还是个初学者。

监听器:

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));
}
android json
1个回答
0
投票

我认为这个问题是使用可变字符串作为内部OnResponse(..)实际字符串的副本。

尝试添加静态到这个变量:

 final static ArrayList<String> string = new ArrayList<>();
© www.soinside.com 2019 - 2024. All rights reserved.