从服务器解析xml时出现NetworkOnMainThreadException

时间:2012-03-16 08:59:48

标签: android exception xml-parsing

我想从服务器解析Xml,但这需要很长时间并最终抛出NetworkOnMainThreadException。 我使用严格模式,但仍然存在NetworkOnMainThreadException。

更新: 我尝试在模拟器上运行aplication,这个例外没有显示。 当我在真实设备上运行应用程序时,此异常显示。

这是解析xml的代码:

public class ParsingXML extends Thread{
            //private Context ctx;
    private int status;
    private String raw_url;
    Context mctx;
    public DefaultHandler getMyExampleHandler() {
        return myExampleHandler;
    }
    DefaultHandler myExampleHandler=null;

    public ParsingXML(Context ctx , int status){
            //this.ctx=ctx;
            this.status=status;
            this.mctx=ctx;
            if(status==constant.GET_LIST_PRODUCT){
                raw_url=constant.URL+"listBarang.php";
            }
    }
    public ParsingXML(Context ctx,int status,String id){
        this.status=status;
        this.mctx=ctx;
        if(status==constant.GET_DETAIL_PRODUCT){
            raw_url=constant.URL+"detailBarang.php?id="+id;
        }
    }
    public void parse(){    
        try {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
                URL url = new URL(raw_url);

                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();
                XMLReader xr = sp.getXMLReader();

                if(status==constant.GET_LIST_PRODUCT){
                    myExampleHandler = new ListProductHandler();
                }
                else if(status==constant.GET_DETAIL_PRODUCT){
                    myExampleHandler = new DetailProductHandler();
                }
                xr.setContentHandler(myExampleHandler);

                xr.parse(new InputSource(url.openStream()));

        } catch (Exception e) {
            Toast.makeText(mctx, "Connection Error", Toast.LENGTH_LONG).show();
        }
                /* Display the TextView. */
    }
}
有人可以帮我吗? 任何帮助非常苛刻。 :)

2 个答案:

答案 0 :(得分:2)

在单独的后台线程中包含您的网络连接以及在不同服务器活动之间解析数据。有一个类调用AsyncTask来执行此操作。在doInBackground()方法中包含您的XML阅读代码段。阅读完所有XML文件后,您可以在onPostExecute()方法中显示结果。

不推荐使用Thread类。这是link to documentation以获取更多详细信息。此过程将使您摆脱NetworkOnMainThreadException

答案 1 :(得分:0)

虽然您扩展了线程,但您的方法parse也没有以线程方式运行,请将parse方法放在run方法中,例如:

public void run(){
    parse();
}