Android XML解析错误

Android XML解析错误,android,xml,parsing,networkonmainthread,Android,Xml,Parsing,Networkonmainthread,我在上一篇文章中尝试从URL开始XML解析: 因此,我尝试使用InputStream获取XML文件,并使用DocumentBuilder解析其中的文本 我试图使用SharedReferences离线存储XML文件 <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string> <name>username</name> <value&g

我在上一篇文章中尝试从URL开始XML解析:

因此,我尝试使用InputStream获取XML文件,并使用DocumentBuilder解析其中的文本

我试图使用SharedReferences离线存储XML文件

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string>
    <name>username</name>
    <value>mium</value>
</string>
然而,我一直得到android.os.NetworkOnMainThreadException。 我尝试添加线程和处理程序,但它总是给我一个错误。
有什么问题吗?我知道它无法在主线程上处理网络进程,但我不知道具体如何解决这个问题。

您不能在主线程上使用网络,因为它会阻止UI组件。 您需要为此使用AsyncTask

new AsyncTask<Void ,Void ,Boolean>(){
            @Override
            protected Boolean doInBackground(Void... voids) {
                return parseXML("http://www.myserver.com/file.xml");
            }

            @Override
            protected void onPostExecute(Boolean aBoolean) {
                super.onPostExecute(aBoolean);
                Log.d(TAG, "Success "+aBoolean);
            }
        }.execute();
newasynctask(){
@凌驾
受保护的布尔doInBackground(Void…voids){
返回parseXML(“http://www.myserver.com/file.xml");
}
@凌驾
受保护的void onPostExecute(布尔aBoolean){
super.onPostExecute(aBoolean);
日志d(标签“成功”+aBoolean);
}
}.execute();

当您在主(GUI)线程上执行网络操作时,会发生
NetworkMainThreadException
,这是不允许的,因为长时间运行的操作会使应用程序无响应


要解决此问题,请将您的操作包装在一个文件中。这将把操作卸载到单独的执行线程上。任务完成后,调用其
onPostExecute
成员将数据传递回主线程。

现在我遇到一个错误:无法在未调用Looper.prepare()的线程内创建处理程序,,这真的很难。这一定是因为您直接在asynctask中使用的共享首选项。请参考此答案,并在asynctask中创建本地共享首选项对象。
if (parseXML("http://www.myserver.com/file.xml")){
    Log.d(TAG, "Success");
}
new AsyncTask<Void ,Void ,Boolean>(){
            @Override
            protected Boolean doInBackground(Void... voids) {
                return parseXML("http://www.myserver.com/file.xml");
            }

            @Override
            protected void onPostExecute(Boolean aBoolean) {
                super.onPostExecute(aBoolean);
                Log.d(TAG, "Success "+aBoolean);
            }
        }.execute();