我的创建代码:
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 []数组,我是怎么做到的?
答案 0 :(得分:1)
你在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
答案 1 :(得分:1)
你需要
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);
}
还要确保在list1
之前初始化setAdapter
因为我没有看到list1
初始化的代码。
答案 2 :(得分:0)
只需在类级别声明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) {}
}
答案 3 :(得分:0)
在这里,您正在创建一个带有重大问题的Array
对象...
Array
对象而不定义它的大小。final
,不允许您向该对象添加新元素。您声明Array
null
并将其定义为final
。当您将Array
声明为final
时,您无法更改Array
。这就是为什么当您要访问Array
返回Array
值时,无法向null
插入新值的原因。这是导致应用程序崩溃的原因。
因此,您需要做的是,定义具有固定大小的values
数组,而不是final
。这些将解决您的所有问题。
现在,替换以下行...
final String[] values = null;
这些......
String[] values;
values = new String[dataJsonArr.length()];