0

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();
    }
4

1 に答える 1

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には、フラグメントの内部クラスとして your を配置する必要があります。

于 2012-10-18T09:49:50.523 に答える