Как обернуть эти классы в AsyncClass и затем использовать их? - PullRequest
1 голос
/ 02 марта 2012

Я пытаюсь собрать простую программу чтения RSS, и нашел код на http://www.ibm.com/developerworks/opensource/library/x-android/

Тодо, поэтому я заметил, что вы не можете выполнять сетевые операции из основного потока, начиная с Honeycomb, и у васвремя оборачивания этого класса в работающий 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);
        }
    }
}

Я не знаю, просто ли я тупой или у меня плохой день, но я не понимаю, как это должно произойти.Может ли кто-нибудь помочь мне и моему полуденному мозгу заставить это работать?

В настоящее время я использую:

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

для обработки потока, как бы я поступил, если бы все было сделано с AsyncTask?1015 *

С уважением

Хиам

1 Ответ

0 голосов
/ 02 марта 2012

Я не пробовал это, но оно должно работать.Обычно AsyncTask извлекает содержимое URL-адресов, анализирует их и публикует проанализированные сообщения.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");

Или вы можете использовать несколько URL:

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