[英]AsyncTask error Android App crashes
我的创建代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.board);
ArrayList<String> passing = new ArrayList<String>();
new AsyncTaskParseJson().execute();
}
这是我的代码:
public class AsyncTaskParseJson extends AsyncTask<String, String, String> {
final String TAG = "AsyncTaskParseJson.java";
String yourJsonStringUrl = "my url here";
JSONArray dataJsonArr = null;
@Override
protected void onPreExecute() {}
@SuppressWarnings("null")
@Override
public String doInBackground(String... arg0) {
final String[] values = null;
try {
// instantiate our json parser
JsonParser jParser = new JsonParser();
// get json string from url
JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl);
// get the array of users
dataJsonArr = json.getJSONArray("response");
// loop through all users
for (int i = 1; i < dataJsonArr.length(); i++) {
JSONObject c = dataJsonArr.getJSONObject(i);
String text = c.getString("text");
values[i]=text;
}
// ArrayAdapter<String> adapter = new ArrayAdapter<String>(Board.this,R.layout.item, R.id.label, values);
// list1.setAdapter(adapter);
}
catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String strFromDoInBg) {}
}
所以,当我像这样评论部分值[i]时,它会启动活动:
//values[i]=text;
但是当它没有被评论时,app就崩溃了。 我想doInBackground返回String []数组,我是怎么做到的?
你在for循环之前再次声明它
values = new String[dataJsonArr.length()];
for (int i = 1; i < dataJsonArr.length(); i++) {
JSONObject c = dataJsonArr.getJSONObject(i);
String text = c.getString("text");
values[i]=text;
}
你需要通过声明new
来保留其在内存中的大小
你需要拥有
values = new String[dataJsonArr.length()];
另请注意,注释行位于doInbackground
。 但是你无法从后台线程更新ui。 所以下面应该转到onPostExecute
。
// ArrayAdapter<String> adapter = new ArrayAdapter<String>(Board.this,R.layout.item, R.id.label, values);
// list1.setAdapter(adapter);
不使用String
数组,最好使用ArrayList<String>
您还需要更改args类型
public class AsyncTaskParseJson extends AsyncTask<String, String, ArrayList<String>> {
然后
@Override
public ArrayList<String> doInBackground(String... arg0) {
ArrayList<String> values = new ArrayList<String>();
try {
// instantiate our json parser
JsonParser jParser = new JsonParser();
// get json string from url
JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl);
// get the array of users
dataJsonArr = json.getJSONArray("response");
// loop through all users
for (int i = 1; i < dataJsonArr.length(); i++) {
JSONObject c = dataJsonArr.getJSONObject(i);
String text = c.getString("text");
values.add(text);
}
}
catch (JSONException e) {
e.printStackTrace();
}
return values;
}
然后
@Override
protected void onPostExecute(ArrayList<String> result) {
super.onPostExecute(result);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(Board.this,R.layout.item, R.id.label, result);
list1.setAdapter(adapter);
}
还要确保在setAdapter
之前初始化list1
,因为我没有看到list1
初始化的代码。
只需在类级别声明String []数组,如下所示,
private static String[] array = null;
public class AsyncTaskParseJson extends AsyncTask<String, String, String> {
final String TAG = "AsyncTaskParseJson.java";
String yourJsonStringUrl = "my url here";
JSONArray dataJsonArr = null;
@Override
protected void onPreExecute() {}
@SuppressWarnings("null")
@Override
public String doInBackground(String... arg0) {
// final String[] values = null;
try {
// instantiate our json parser
JsonParser jParser = new JsonParser();
// get json string from url
JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl);
// get the array of users
dataJsonArr = json.getJSONArray("response");
// loop through all users
for (int i = 1; i < dataJsonArr.length(); i++) {
JSONObject c = dataJsonArr.getJSONObject(i);
String text = c.getString("text");
values[i]=text;
}
// ArrayAdapter<String> adapter = new ArrayAdapter<String>(Board.this,R.layout.item, R.id.label, values);
// list1.setAdapter(adapter);
}
catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String strFromDoInBg) {}
}
在这里,您正在创建一个带有主要问题的Array
对象...
Array
对象而不定义它的大小。 final
,不允许您向该对象添加新元素。 您声明一个为null
的Array
,并将其定义为final
。 将Array
声明为final
则无法更改该Array
。 这就是为什么你不能向该Array
插入新值,因此,当你要访问该Array
它返回的null
值。 这是导致应用程序崩溃的原因。
因此,您需要做的是,使用固定大小定义values
数组,而不是将其设置为final
。 这些将解决您的所有问题。
现在,替换以下行...
final String[] values = null;
用这些...
String[] values;
values = new String[dataJsonArr.length()];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.