【问题标题】:Android Studio crash when retrieving content from array从数组中检索内容时 Android Studio 崩溃
【发布时间】:2014-01-20 13:04:59
【问题描述】:

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

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 数据。将此数据存储在一个数组中,当我尝试检索此数据时,应用程序将崩溃。

【问题讨论】:

  • 什么是崩溃日志?
  • 代码有什么问题? - 您错误地期望AsyncHttpClient 中的代码会立即运行,正好赶上该列表访问成功。这不会发生。
  • 您的System.out.println(titleArray.get(0)); 可能在AsyncHttpClient 完成之前在getJSONData(); 方法内运行..
  • @Luksprog 我将数据存储在数组中,对吗?那为什么我不能找回呢? -.- 对不起,我只是 Android 开发的初学者,真的很想了解我做错了什么......
  • @Vision 您没有做错任何事情..但是您的 AsynClient 正在使用您的代码...请参阅我的解释答案

标签: android arrays json listview android-listview


【解决方案1】:

像这样改变你的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));

 }

 }

【讨论】:

【解决方案2】:

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

让我们看看你的代码:

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

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

为什么是空的? AsyncHttpClient 将在后台加载数据,因此您的 ArrayList 将在请求成功后而不是在您开始下载任务后立即在 AsyncHttpResponseHandleronSuccess 中获取其内容你的数据。调用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 时处理所有数据,以确认您请求的信息已成功接收。只是不要尝试访问您不确定是否已经拥有的数据。

您可能想看看这里:http://developer.android.com/guide/components/processes-and-threads.html

【讨论】:

    【解决方案3】:

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

    所以它正在以异步方式执行下一条语句。

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

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

    getJSONData()returnvoid 更改为ArrayList&lt;String&gt;

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

    希望这可以帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      相关资源
      最近更新 更多