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 我想在一个软件里添加一个优惠弹窗,应该怎么写代码
  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流