我有一个应用程序,读取3-5个RSS源并在UI上显示标题.我把读取代码放在asynctask中以保持UI响应.但是我的代码一次只读取一个feed,我想同时读取3个RSS源,看看我是否可以加快解析过程并在UI上更快地呈现标题.
我已经尝试使用线程 – 但后来我遇到了一个问题,我不知道哪个线程会先完成,第二个也是最后一个……好吧,我只是弄清楚如何检查最慢的线程何时有完成后我可以按日期和时间对rss新闻对象进行排序.所以最终我尝试使用asynctask一次读取一个feed,如下所示:
class ReadFeedsTask extends AsyncTask<Void, String, Void> {
@Override
protected Void doInBackground(Void... unused) {
try {
URL url = new URL("http://www.fyens.dk/rss/sport");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream is = conn.getInputStream();
DocumentBuilderFactory dbf = DocumentBuilderFactory
.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(is);
Element element = document.getDocumentElement();
NodeList nodeList = element.getElementsByTagName("item");
if (nodeList.getLength() > 0) {
for (int i = 0; i < nodeList.getLength(); i++) {
Element entry = (Element) nodeList.item(i);
Element _titleE = (Element) entry.getElementsByTagName(
"title").item(0);
Element _descriptionE = (Element) entry
.getElementsByTagName("description").item(0);
Element _pubDateE = (Element) entry
.getElementsByTagName("pubDate").item(0);
Element _linkE = (Element) entry.getElementsByTagName(
"link").item(0);
String _title = _titleE.getFirstChild().getNodeValue();
String _description = _descriptionE.getFirstChild().getNodeValue();
Date _pubDate = new Date(_pubDateE.getFirstChild().getNodeValue());
String _link = _linkE.getFirstChild().getNodeValue();
等等..
然后我为其他rss feed重复此过程.
如何使用此代码同时读取多个提要 – 如果不是通过使用asynctasc然后使用线程?我的问题是,我无法理解如何等待直到所有线程都已完成,所以我可以对结果进行排序并呈现最新的第一个?
解决方法:
我的思维过程是这样的:
>创建所有Feed的列表.
>从1到最大线程数,生成一个新线程以从Feed中检索数据
>当一个线程完成时,检查列表以查看剩余的Feed;如果还有更多,请从列表中删除Feed并从Feed中检索数据
>每个线程一旦完成,就将其检索到的源的数据添加到您用于列表适配器的任何数据源,对数据源进行排序,并通知列表数据集已更改.