我目前从异步方法 (XmlParser.java) 获取 Json 数据并将其作为字符串传回 TextView ,我现在需要传回一个 ArrayList,我需要在下面的代码中为此更改什么上类?
BookDetail.java
public class BookDetail extends AppCompatActivity {
public static TextView tvBooks;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_schedule_detail);
tvBooks = (TextView) findViewById(R.id.tvBooks);
XmlParser xmlParser = new XmlParser();
XmlParser.theUrl = "http://pathtoapi.xxxxx/api;
xmlParser.execute();
}
}
XMLParser.java
public class XmlParser extends AsyncTask<Void,Void,Void> {
String data ="";
String dataParsed = "";
String singleParsed ="";
public static String theUrl;
protected Void doInBackground(Void... voids) {
try {
URL url = new URL(theUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while(line != null){
line = bufferedReader.readLine();
data = data + line;
}
list = new ArrayList<Agenda>();
JSONArray JA = new JSONArray(data);
for(int i =0 ;i <JA.length(); i++){
JSONObject JO = (JSONObject) JA.get(i);
singleParsed = "Book: " + JO.get("bookName");
dataParsed = dataParsed + singleParsed +"\n" ;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// Here a TextView is populated with String
// But I would like to pass an ArrayList instead that can populate a ListView instead
BookDetail.tvBooks.setText(this.dataParsed);
}
}
最佳答案
如果你想从 AsyncTask
返回一个值,那么你的 AsyncTask
定义必须像这样:
public class XmlParser extends AsyncTask<Void,Void,ArrayList<Agenda>> {
protected ArrayList<Agenda> doInBackground(Void... voids) {
// do background
return list;
}
protected void onPostExecute(ArrayList<Agenda> list) {
}
}
在AsyncTask模板中,第一个参数是传给task的值类型,第二个参数是传给onProgress的值,最后一个参数是doInBackground的返回值类型
并在执行语句的末尾添加get方法:
ArrayList<Agenda> list = xmlParser.execute().get();
关于android - 从异步方法传递 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52868634/