android - 从异步方法传递 ArrayList

标签 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 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/

相关文章:

android - 在 Android 中以编程方式写入 PCM WAV 数据

android - 在线程 2017 中显示进度对话框

java - 如果用户没有一直下拉,如何使Android pulltorefresh弹回?

Java:ConcurrentModificationException,3个线程,不同的列表,相同的对象

java - Project Euler #4 ArrayList 不添加整数

android - Xposed 和 onCheckedChanged 代码 - 编译错误

java - 将 ArrayList<String> 转换为 byte[]

android - 如何每 30 分钟运行某种重复任务?

java - 如何管理同步任务中的线程数

java - 使用 AsyncTask 读取 Firestore 文档