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

从数组检索内容时Android Studio崩溃,android,arrays,json,listview,android-listview,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 o

这可能是个简单的问题,但我就是想不出来。考虑下面的代码:

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


    });

}
问题来了当我尝试在“onCreate void”中检索数组时,应用程序将崩溃

代码:

公共类活动ViewController扩展活动{
ArrayList titleArray;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activitiesviewcontroller);
getJSONData();
System.out.println(titleArray.get(0));
}
}

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

因为您使用的是
AsyncHttpClient=new AsyncHttpClient()

因此,它以Asyn方式执行下一条语句

:它以与前一种方式并行的方式执行下一条语句

 getJSONData();

 System.out.println(titleArray.get(0));
getJSONData()
return
更改为
ArrayList
void

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


希望这能帮助…

因为您使用的是
AsyncHttpClient=new AsyncHttpClient()

因此,它以Asyn方式执行下一条语句

:它以与前一种方式并行的方式执行下一条语句

 getJSONData();

 System.out.println(titleArray.get(0));
getJSONData()
return
更改为
ArrayList
void

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


希望这能帮助…

像这样更改您的
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;
}
private ArrayList()getJSONData(){
AsyncHttpClient=新的AsyncHttpClient();
client.get(“http://dev.vision-is.nl/klanten/so/content.json,新的AsyncHttpResponseHandler(){
@凌驾
成功时公共无效(字符串响应){
//TODO自动生成的方法存根
试一试{
JSONArray JSONArray=新JSONArray(响应);
titleArray=newarraylist();
for(int i=0;i
那么您的活动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));

 }

 }
公共类活动ViewController扩展活动{
ArrayList titleArray;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activitiesviewcontroller);
titleArray=getJSONData();
System.out.println(titleArray.get(0));
}
}

像这样更改
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;
}
private ArrayList()getJSONData(){
AsyncHttpClient=新的AsyncHttpClient();
client.get(“http://dev.vision-is.nl/klanten/so/content.json,新的AsyncHttpResponseHandler(){
@凌驾
成功时公共无效(字符串响应){
//TODO自动生成的方法存根
试一试{
JSONArray JSONArray=新JSONArray(响应);
titleArray=newarraylist();
for(int i=0;i
那么您的活动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));

 }

 }
公共类活动ViewController扩展活动{
ArrayList titleArray;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activitiesviewcontroller);
titleArray=getJSONData();
System.out.println(titleArray.get(0));
}
}

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

让我们看看您的代码:

getJSONData();
System.out.println(titleArray.get(0));
这样,getJSONData()将执行,System.out.println()也将执行。但是println()将(可能)提供IndexOutOfBoundsException,因为
titleArray
仍然为空

为什么是空的?
AsyncHttpClient
将在后台加载数据,因此在请求成功后,而不是在开始下载数据的任务后,ArrayList将在
AsyncHttpResponseHandler
onSuccess
中获取其内容。调用
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
        }
    });
异步方法的模式是我们防止应用程序冻结或崩溃的方式,这(当然)会激怒我们的用户

AsyncHttpClient
调用
onSuccess
时,您应该执行任务,然后处理所有数据,以确认您请求的信息已成功