从数组中检索内容时Android Studio崩溃

时间:2014-01-20 13:05:00

标签: android arrays json listview android-listview

这可能是一个简单的问题,但我无法理解。请考虑以下代码:

private void getJSONData() {

    AsyncHttpClient client = new AsyncHttpClient();
    client.get("http://dev.vision-is.nl/klanten/so/content.json", new AsyncHttpResponseHandler() {

        @Override
        public void onSuccess(String response) {
            // TODO Auto-generated method stub

            try {
                JSONArray jsonArray = new JSONArray(response);

                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);

                    String titleString = (String) jsonObject.get("title");

                    titleArray = new ArrayList<String>();

                    titleArray.add(titleString);

                    System.out.println(titleArray.get(0));

                }


            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        @Override
        public void onFailure(Throwable arg0, String arg1) {
            // TODO Auto-generated method stub
            System.out.println(arg1);
        }


    });

}

此代码有效,并为我提供输出:

01-20 13:11:48.076  31508-31508/com.soccer.soccerapp I/System.out﹕ OUTPUT: Barcelona - Real Madrid
01-20 13:11:48.076  31508-31508/com.soccer.soccerapp I/System.out﹕ OUTPUT: Ajax - Barcelona
01-20 13:11:48.077  31508-31508/com.soccer.soccerapp I/System.out﹕ OUTPUT: Manchester United - Chelsea
01-20 13:11:48.078  31508-31508/com.soccer.soccerapp I/System.out﹕ OUTPUT: Ajax - PSV

问题就出现了!当我尝试在“onCreate void”中检索数组时,应用程序将崩溃......

代码:

public class ActivitiesViewController extends Activity {

ArrayList<String> titleArray;

  @Override
     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

     setContentView(R.layout.activitiesviewcontroller);

     getJSONData();

     System.out.println(titleArray.get(0));

  }

}

代码有什么问题?我检索json数据。将此数据存储在一个数组中,当我尝试检索此数据时,应用程序将崩溃。

3 个答案:

答案 0 :(得分:2)

像这样更改您的getJSONData()方法

 private ArrayList<String>() getJSONData() {

    AsyncHttpClient client = new AsyncHttpClient();
    client.get("http://dev.vision-is.nl/klanten/so/content.json", new AsyncHttpResponseHandler() {

        @Override
        public void onSuccess(String response) {
            // TODO Auto-generated method stub

            try {
                JSONArray jsonArray = new JSONArray(response);
                titleArray = new ArrayList<String>();

                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);

                    String titleString = (String) jsonObject.get("title");

                    titleArray.add(titleString);

                    System.out.println(titleArray.get(0));

                }


            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        @Override
        public void onFailure(Throwable arg0, String arg1) {
            // TODO Auto-generated method stub
            System.out.println(arg1);
        }


    });
     return titleArray;
}

那么你的活动oncreate代码应该是

public class ActivitiesViewController extends Activity {

ArrayList<String> titleArray;

@Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

 setContentView(R.layout.activitiesviewcontroller);

titleArray = getJSONData();

 System.out.println(titleArray.get(0));

 }

 }

答案 1 :(得分:1)

您使用AsyncHttpClient client = new AsyncHttpClient();.

所以它是在Asyn Manner中执行下一个声明。

:它是以前一种方式并行执行Next语句

 getJSONData();

 System.out.println(titleArray.get(0));

return的{​​{1}}更改为getJSONData() <{1}}

现在,如果您尝试在不同位置获取值,您可以找到它

希望这可以帮助......

答案 2 :(得分:1)

由于您使用的是AsyncHttpClient,因此执行网络请求的代码将不会与您的其余代码并行执行。

让我们来看看你的代码:

getJSONData();
System.out.println(titleArray.get(0));

这样,getJSONData()将执行,System.out.println()也将执行。但是println()会(可能)给出一个IndexOutOfBoundsException,因为titleArray仍然是空的。

为什么空? AsyncHttpClient将在后台加载数据,因此在请求成功后,您的ArrayList将在onSuccess AsyncHttpResponseHandler中获取其内容,而不是在之后您开始下载数据的任务。调用get()将启动一个不会阻止其余代码执行的过程,因此println正在读取一个空数组。

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://dev.vision-is.nl/klanten/so/content.json", new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(String response) {
            // Process data after request succeeded
        }

        @Override
        public void onFailure(Throwable arg0, String arg1) {
            // Print error after request failed
        }
    });

异步方法的模式是我们阻止我们的应用程序冻结或崩溃的方式,这当然会激怒我们的用户。

您应执行任务,然后在onSuccess调用AsyncHttpClient时处理所有数据,以确认您要求的信息已成功收到。只是不要尝试访问您不确定已有的数据。

您可能需要查看此处:http://developer.android.com/guide/components/processes-and-threads.html