2012-03-02 63 views
1

我試圖把一個簡單的RSS閱讀器,並找到代碼上http://www.ibm.com/developerworks/opensource/library/x-android/如何將這些類包裝到AsyncClass中,然後使用它們?

藤所以,我注意到,你不能因爲蜂窩主線程做網絡運營和有一個很難包裝該類成一個工作的AsyncTask:

package tlib.net.rss; 

import java.util.ArrayList; 
import java.util.List; 

import android.sax.Element; 
import android.sax.EndElementListener; 
import android.sax.EndTextElementListener; 
import android.sax.RootElement; 
import android.util.Xml; 

public class SaxFeedParser extends BaseFeedParser { 

    public SaxFeedParser(String feedUrl) { 
     super(feedUrl); 
    } 

    public List<Message> parse() { 
     final Message currentMessage = new Message(); 
     RootElement root = new RootElement("rss"); 
     final List<Message> messages = new ArrayList<Message>(); 
     Element channel = root.getChild("channel"); 
     Element item = channel.getChild(ITEM); 
     item.setEndElementListener(new EndElementListener(){ 
      public void end() { 
       messages.add(currentMessage.copy()); 
      } 
     }); 
     item.getChild(TITLE).setEndTextElementListener(new EndTextElementListener(){ 
      public void end(String body) { 
       currentMessage.setTitle(body); 
      } 
     }); 
     item.getChild(LINK).setEndTextElementListener(new EndTextElementListener(){ 
      public void end(String body) { 
       currentMessage.setLink(body); 
      } 
     }); 
     item.getChild(DESCRIPTION).setEndTextElementListener(new 
EndTextElementListener(){ 
      public void end(String body) { 
       currentMessage.setDescription(body); 
      } 
     }); 
     item.getChild(PUB_DATE).setEndTextElementListener(new EndTextElementListener(){ 
      public void end(String body) { 
       currentMessage.setDate(body); 
      } 
     }); 
     try { 
      Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler()); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
     return messages; 
    } 
} 

此代碼還調用基類:其中BaseFeedParser我想也必須被包裹成的AsyncTask。對於BaseFeedParser代碼如下:

import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 

public abstract class BaseFeedParser implements FeedParser { 

    // names of the XML tags 
    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"; 

    private final URL feedUrl; 

    protected BaseFeedParser(String feedUrl){ 
     try { 
      this.feedUrl = new URL(feedUrl); 
     } catch (MalformedURLException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    protected InputStream getInputStream() { 
     try { 
      return feedUrl.openConnection().getInputStream(); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

我不知道,如果我只是啞或有一個糟糕的一天,但我不明白這是怎麼supposted到happend。有人可以幫助我和我的下午大腦去做這個工作嗎?

目前我使用:

SaxFeedParser rss = new SaxFeedParser("http://www.androidster.com/android_news.rss"); 
messages = rss.parse(); 
for(Message message : messages) 
{ 
    tv.appendText(message); 
} 

處理流,如何將我做的一切,如果用的AsyncTask做了什麼?

親切的問候

回答

0

我沒有試過,但它應該工作。
基本上,AsyncTask將檢索url(s)內容,解析它併發布解析的消息。
onProgressUpdate()用於根據您的需要安全地更新用戶界面。

class ParserTask extends AsyncTask<String, List<Message>, Long> { 

    protected Long doInBackground(String... urls) { 
     if (urls == null || urls.length == 0) 
      return null; 
     for (String url : urls) { 
      SaxFeedParser rss = new SaxFeedParser(url); 
      List<Message> messages = rss.parse(); 
      publishProgress(messages); 
     } 
     return null; //return somethingForPostExecute; 
    } 

    protected void onProgressUpdate(List<Message>... messages) { 
     if (messages == null || messages.length == 0) 
      return; 
     for (Message message : messages[0]) { 
      // tv.appendText(message); 
      // or call method from GUI thread (the activity) 
     } 
    } 

    protected void onPostExecute(Long nr) { 

    } 
} 

然後你使用這樣的:

new ParserTask().execute("http://www.androidster.com/android_news.rss"); 

或者你可以使用多個網址:

new ParserTask().execute(new String[]{"http://www.androidster.com/android_news.rss", "..."}); 
+0

返回以下錯誤: http://pastebin.com/pXN2L3gi – Hiam 2012-03-02 13:44:27

+0

廠對於我來說足夠了。你應該嘗試另一個URL,那個似乎被破壞了。 – 2012-03-05 19:58:34

+0

我把所有東西都燒成了一個小小的班級,並設法讓你的幫助工作。謝謝 :) – Hiam 2012-03-07 11:34:16

相關問題