从数组检索内容时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
时,您应该执行任务,然后处理所有数据,以确认您请求的信息已成功