有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用异步任务和线程获取数据

我试图从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) 个答案

  1. # 1 楼答案

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