2012-10-18 31 views
0

我试图从RSS提要中获取数据以将其显示为片段(11片段),但每次我传递一个新片段的UI块几秒钟,因为它正在提取数据,所以我尝试使用asyncTask在后台执行此操作,但似乎不起作用。使用asyncTask和线程获取数据

public class AndroidSaxFeedParser extends AsyncTask<String, Long, ArrayList<Article>>{ 

String dt; 
String bb; 
String nameCat; 
RootElement root; 
Element item; 

static final String RSS = "rss"; 
static final String FEED = "feed"; 
static final String ENTRY = "entry"; 
static final String CHANNEL = "channel"; 
static final String PUB_DATE = "pubDate"; 
static final String DESCRIPTION = "description"; 
static final String LINK = "link"; 
static final String TITLE = "title"; 
static final String ITEM = "item"; 
static final String CATEGORY = "category"; 
static final String DURATION = "itunes:duration"; 

ArrayList<Article> rssItems = new ArrayList<Article>(); 

public URL feedUrl; 

Context mContext; 

public AndroidSaxFeedParser(Context context) 
{ 
    mContext = context; 

} 

// ProgressDialog pd = new ProgressDialog(mContext); 

@Override 
protected void onPostExecute(ArrayList<Article> result) { 
//  pd.dismiss();  
    super.onPostExecute(result); 
} 

@Override 
protected void onPreExecute() { 
//  ProgressDialog.show(mContext, "", "Chargement..."); 
    super.onPreExecute(); 
} 

@Override 
protected ArrayList<Article> doInBackground(String... params) { 

    try { 
     feedUrl = new URL(params[0]); 
    } catch (MalformedURLException e1) { 
     e1.printStackTrace(); 
    } 

    final Article currentRssItem = new Article(); 
    root = new RootElement(RSS); 
    Element channel = root.getChild(CHANNEL); 
    item = channel.getChild(ITEM); 

    item.getChild(TITLE).setEndTextElementListener(new EndTextElementListener(){ 
     public void end(String body) { 
      currentRssItem.setTitle(body); 
      Log.i("Title Article", " "+currentRssItem.getTitle()); 
     } 
    }); 

    item.getChild(CATEGORY).setEndTextElementListener(new EndTextElementListener(){ 
     public void end(String body) { 
      currentRssItem.setCategorie(body); 
      Log.i("Category Article", " "+currentRssItem.getCategorie()); 
     } 
    }); 

    item.getChild(DESCRIPTION).setEndTextElementListener(new EndTextElementListener(){ 
     public void end(String body) { 
      String imgUrl, desc; 
      try {imgUrl = body.substring(body.indexOf("src=")+5,body.indexOf("\"", body.indexOf("src=")+6));} 
      catch (Exception e) 
      {imgUrl = "";} 
      try {desc=body;} 
      catch (Exception e) 
      { desc = "";} 
      currentRssItem.setImageUrl(imgUrl); 
      currentRssItem.setDescription(desc); 

      Log.i("Image URL Article", " "+currentRssItem.getImageUrl()); 
      Log.i("Description Article", " "+currentRssItem.getDescription()); 
     } 
    }); 

    item.getChild(PUB_DATE).setEndTextElementListener(new EndTextElementListener(){ 
     public void end(String body) { 
      currentRssItem.setPubDate(body); 
      Log.i("Date Article", " "+currentRssItem.getPubDate()); 
     } 
    }); 

    item.setEndElementListener(new EndElementListener(){ 
     public void end() { 
      rssItems.add(currentRssItem.copy()); 
     } 
    }); 
    try { 
     Xml.parse(feedUrl.openConnection().getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (SAXException e) { 
     e.printStackTrace(); 
    } 
    return rssItems; 
} 

我这样在每个片段中

ArrayList<Article> feeds ; 
    try { 
     feeds=AndroidSaxFeedParser.execute(url).get(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 
+1

“它似乎不工作”是非常通用的。你必须总是详细说明问题。 – waqaslam

+0

我的意思是说,每当我传递给一个新的片段时,用户界面仍然会阻塞几个次端。 –

回答

0

称其你应该总是下载的文件,并要求XML类来分析它之前将其保存为String

public String getXml(String url) { 
HttpGet request = new HttpGet(url); 
HttpResponse response = client.execute(request); 

// HTTP OK 200 
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
    HttpEntity entity = response.getEntity(); 
    // NOTE: Here need to set the default charset to be UTF-8 
    content = EntityUtils.toString(entity, "UTF-8"); 
    return content; 
} 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (IllegalStateException e) { 
    content = null; 
} 
} 

以这种方式,由于连接问题而不太可能中断。另外,请告诉我们更多关于“似乎不起作用”的含义。它没有解析XML,无法运行任务,或失败了什么?

而且,你不应该调用

feeds=AndroidSaxFeedParser.execute(url).get();

在片段

。你应该修改AndroidSaxFeedParser的此功能:

@Override 
protected void onPostExecute(ArrayList<Article> result) { 
    feeds = result; 
    // Do whatever you wanna do to set up things with the feeds 
} 

为了使这个工作你必须把你的AndroidSaxFeedParser作为一个内部类的片段。

+0

每当我传递给一个新的片段时,UI仍会阻止几次调用。 –

+0

你可以请给我所有的代码,我必须放在我的片段,我不认为我在哪里调用getXml()! –