Android 从异步方法传递ArrayList

Android 从异步方法传递ArrayList,android,arraylist,android-asynctask,Android,Arraylist,Android Asynctask,我目前从一个异步方法(XmlParser.java)获取Json数据,并将其作为字符串传递回textview,现在我需要传递回一个ArrayList,我需要在下面的代码中更改什么才能使其工作 BookDetail.java public class BookDetail extends AppCompatActivity { public static TextView tvBooks; @Override protected void onCreate(Bundle savedInsta

我目前从一个异步方法(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();
}

}
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);
}   

}
XMLParser.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();
}

}
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);
}   

}
public类XmlParser扩展异步任务{
字符串数据=”;
字符串dataParsed=“”;
字符串singleParsed=“”;
公共静态字符串URL;
受保护的空位背景(空位…空位){
试一试{
URL=新的URL(URL);
HttpURLConnection HttpURLConnection=(HttpURLConnection)url.openConnection();
InputStream InputStream=httpURLConnection.getInputStream();
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream));
字符串行=”;
while(行!=null){
line=bufferedReader.readLine();
数据=数据+行;
}
列表=新的ArrayList();
JSONArray JA=新JSONArray(数据);

对于(int i=0;i如果要从
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) {
    }
}
public类XmlParser扩展异步任务{
受保护的ArrayList doInBackground(无效…无效){
//做背景
退货清单;
}
受保护的void onPostExecute(ArrayList列表){
}
}
在AsyncTask模板中,第一个参数是传递给task的值的类型,第二个参数是传递给onProgress的值,最后一个参数是返回值doInBackground的类型

并将get方法添加到execute语句的末尾:

    ArrayList<Agenda> list = xmlParser.execute().get();
ArrayList list=xmlParser.execute().get();

非常好用,非常感谢!不客气,请接受并投票支持答案。@MTplus如果有效,请将此答案作为正确答案