我有一个应用程序,阅读约3-5 rss饲料,并在UI上呈现标题。我已经将读取代码放在一个异步任务中,以保持UI的响应。但是我的代码一次读取一个提要,我想同时读取3个rss提要,看看是否可以加快解析过程,并在UI上更快地呈现标题。
我尝试过使用线程--但是后来我遇到了一个问题,我不知道哪个线程会先完成,第二个,最后一个和..好吧,我只是想不出如何检查最慢的线程何时结束,这样我就可以按日期和时间对rss新闻对象进行排序。所以最终我尝试使用asynctask一次读取一个提要,如下所示:
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提要重复此过程。
如何使用此代码同时读取多个提要-如果不使用异步,则使用线程?我的问题是,我不能理解如何等待,直到所有线程都完成,这样我才能对结果进行排序,并首先呈现最新的结果?
发布于 2011-12-03 04:19:22
我的思维过程是这样的:
<代码>G29
发布于 2011-12-03 05:45:18
AsyncTask创建生命周期实际上是由隐藏在所有API级别的线程池管理的,这个线程池从API级别11就可以访问了,然而,这并不意味着我们不能在API级别11之前创建多个AsyncTask实例,请查看我的SO问题here以获取更多详细信息。
回到你的主题,你总是可以预先分析你的问题集,并将其拆分/缩放为子集,例如,总共100个rss feed可以被分成5个分块(每个分块依次执行20个RSS feed ),然后将这些预处理的子集分成5个AsyncTask:
ArrayList<ProblemSet> problemSets = splitBigProblemSet();
for (ProblemSet problemSet : problemSets) {
new ProblemResolverAsynTask().execute(problemSet);
}这将给你5RSS异步运行,并且可能比使用1 AysncTask下载100RSS提要快5倍。请注意,也可以为每个RSS创建AsyncTask,这是一个非常糟糕的做法,因为如果您的问题集很大,它将很快消耗您的内存并杀死系统。
希望这能有所帮助。
https://stackoverflow.com/questions/8361929
复制相似问题