这可能是一个简单的问题,但我无法理解。请考虑以下代码:
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数据。将此数据存储在一个数组中,当我尝试检索此数据时,应用程序将崩溃。
答案 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