[英]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.