使用asyncTask和线程获取数据

时间:2012-10-18 09:25:10

标签: java android multithreading rss android-asynctask

我正在尝试从RSS提要中获取数据以显示片段(11片段),但每次我将UI块传递给新片段几秒钟,因为它正在获取数据,所以我尝试使用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 个答案:

答案 0 :(得分:0)

在请求String类解析文件之前,您应始终下载该文件并将其另存为XML

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作为片段的内部类。