tyt913882275 2013-10-05 13:31 采纳率: 0%
浏览 1259

Android下载解析xml文件ListView中数据无法更新,要添加一个线程应该可以。求帮助

我用的Android4.1的手机和Android4.2的模拟器,项目可以正常运行,没有报错,就是下载xml文件解析的数据无法正常显示到Listview中。之前用了个Thread()的可以下载解析xml,不用Thread()的话,就无法下载解析XML中数据,但是在Listview中使用Thread()又要报错了。
@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (item.getItemId() == UPDATE) {
        //用户点击了 更新列表 按钮
        //new Thread(){ 
            //public void run(){
                updateListView();
            //}
        //}.start();            
    }
    else if (item.getItemId() == ABOUT) {
        //用户点击了 关于 按钮
    }
    return super.onOptionsItemSelected(item);
}

private SimpleAdapter buildSimpleAdapter(List<Mp3Info> mp3Infos) {
    // 生成一个List对象,并按照SimpleAdapter的标准,将mp3Infos当中的数据添加到List当中去
    List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
    for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) {
        Mp3Info mp3Info = (Mp3Info) iterator.next();
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("mp3_name", mp3Info.getMp3Name());
        map.put("mp3_size", mp3Info.getMp3Size());
        list.add(map);
    }
    // 创建一个SimpleAdapter对象
    SimpleAdapter simpleAdapter = new SimpleAdapter(this, list,
            R.layout.mp3info_item, new String[] { "mp3_name", "mp3_size" },
            new int[] { R.id.mp3_name, R.id.mp3_size });
    // 将这个SimpleAdapter对象设置到ListActivity当中
    return simpleAdapter;
}

private void updateListView() {

    // 用户点击了更新列表按钮
    // 下载包含所有Mp3基本信息的xml文件
    String xml = downloadXML("http://59.69.26.186:8080/mp3/resources.xml");
    // 对xml文件进行解析,并将解析的结果放置到Mp3Info对象当中,最后将这些Mp3Info对象放置到List当中
    mp3Infos = parse(xml);
    SimpleAdapter simpleAdapter = buildSimpleAdapter(mp3Infos);
    setListAdapter(simpleAdapter);

}

private String downloadXML(String urlStr){
    HttpDownloader httpDownloader = new HttpDownloader();
    String result = httpDownloader.download(urlStr);
    return result;
}

private List<Mp3Info> parse(String xmlStr){
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    List<Mp3Info> infos = new ArrayList<Mp3Info>();
    try {
        XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
        Mp3ListContentHandler mp3ListContentHandler = new Mp3ListContentHandler(infos);
        xmlReader.setContentHandler(mp3ListContentHandler);
        xmlReader.parse(new InputSource(new StringReader(xmlStr)));
        for (Iterator iterator = infos.iterator(); iterator.hasNext();) {
            Mp3Info mp3Info = (Mp3Info) iterator.next();
            System.out.println(mp3Info);
        }
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    return infos;
}

}

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-25 18:06
    关注

    该回答引用ChatGPT

    根据你的代码,似乎是在主线程中进行了网络下载和XML解析操作,这样做会导致主线程被阻塞,可能会导致UI无响应或者ANR(Application Not Responding)异常。因此,建议在单独的线程中执行这些操作,避免阻塞主线程。


    在您的代码中,您使用了一个注释掉的Thread(),您可以取消注释并使用它来在新的线程中执行updateListView()方法。此外,如果您想在主线程中执行UI更新操作,可以使用runOnUiThread()方法。


    以下是修改建议:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        if (item.getItemId() == UPDATE) {
            // 用户点击了 更新列表 按钮
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // 在新线程中执行下载和解析操作
                    String xml = downloadXML("http://59.69.26.186:8080/mp3/resources.xml");
                    mp3Infos = parse(xml);
                    // 在UI线程中更新ListView
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            SimpleAdapter simpleAdapter = buildSimpleAdapter(mp3Infos);
                            setListAdapter(simpleAdapter);
                        }
                    });
                }
            }).start();            
        }
        else if (item.getItemId() == ABOUT) {
            // 用户点击了 关于 按钮
        }
        return super.onOptionsItemSelected(item);
    }
    

    这里将下载和解析操作放在新的线程中执行,同时将UI更新操作放在runOnUiThread()方法中。注意,在runOnUiThread()方法中更新UI的代码是在主线程中执行的,而downloadXML()和parse()方法是在新线程中执行的,避免了主线程被阻塞。

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘