原因:android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图

原因:android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图,android,Android,我正试图编写一个程序来解析给定的xml。但是,它会抛出错误消息:“原因:android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。” 这是我的密码 package com.example.xmlparserdeneme; import java.io.IOException; import java.util.ArrayList; import javax.xml.parsers.P

我正试图编写一个程序来解析给定的xml。但是,它会抛出错误消息:“原因:android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。” 这是我的密码

    package com.example.xmlparserdeneme;

import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.ListView;

public class MainActivity extends Activity {

    ArrayList<String> titles = new ArrayList<String>();
    Context ctx = this;
    CustomAdapter adapter = null;
    ListView lv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((Activity) ctx).setContentView(R.layout.activity_main);

        new parseXML().execute();

        Log.i("info2", titles.toString());

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    class parseXML extends AsyncTask<String, Void, String> {

        MySaxHandler handler;

        @Override
        protected String doInBackground(String... params) {

            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser parser = null;
            try {
                parser = spf.newSAXParser();
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            }

            handler = new MySaxHandler();

            try {
                parser.parse(
                        "/xmlParserDeneme/src/Database.xml",
                        handler);
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            Log.i("info", titles.toString());
            return "a";

        }

        @Override
        protected void onPostExecute(String result) {

            lv = (ListView) findViewById(R.id.listView);
            lv.setAdapter(new CustomAdapter(titles, ctx));
        }

        public ArrayList<String> getArray() {
            return titles;
        }

        public class MySaxHandler extends DefaultHandler {

            StringBuffer chars;

            public void startElement(String uri, String localName,
                    String qName, Attributes atts) {
                chars = new StringBuffer();

            }

            public void endElement(String uri, String localName, String qName)
                    throws SAXException {

                if (localName.equalsIgnoreCase("description"))
                    titles.add(chars.toString());

            }

            public void characters(char ch[], int start, int length) {
                chars.append(new String(ch, start, length));
            }

        }

    }
}
package com.example.xmlparserdenme;
导入java.io.IOException;
导入java.util.ArrayList;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.parsers.SAXParser;
导入javax.xml.parsers.SAXParserFactory;
导入org.xml.sax.Attributes;
导入org.xml.sax.SAXException;
导入org.xml.sax.helpers.DefaultHandler;
导入android.app.Activity;
导入android.content.Context;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.Menu;
导入android.widget.ListView;
公共类MainActivity扩展了活动{
ArrayList titles=新的ArrayList();
上下文ctx=此;
CustomAdapter=null;
ListView lv;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
(Activity)ctx.setContentView(R.layout.Activity_main);
新建parseXML().execute();
Log.i(“info2”,titles.toString());
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
类parseXML扩展了异步任务{
MySaxHandler;
@凌驾
受保护的字符串doInBackground(字符串…参数){
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser=null;
试一试{
parser=spf.newSAXParser();
}捕获(ParserConfiguration异常e){
e、 printStackTrace();
}捕获(SAXE异常){
e、 printStackTrace();
}
handler=新的MySaxHandler();
试一试{
parser.parse(
“/xmlparserdenme/src/Database.xml”,
经办人);
}捕获(SAXE异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
Log.i(“info”,titles.toString());
返回“a”;
}
@凌驾
受保护的void onPostExecute(字符串结果){
lv=(ListView)findViewById(R.id.ListView);
lv.setAdapter(新的CustomAdapter(标题,ctx));
}
公共数组列表getArray(){
返回标题;
}
公共类MySaxHandler扩展了DefaultHandler{
字符串缓冲字符;
public void startElement(字符串uri、字符串localName、,
字符串(名称、属性和附件){
chars=新的StringBuffer();
}
公共void endElement(字符串uri、字符串localName、字符串qName)
抛出SAX异常{
if(localName.equalsIgnoreCase(“说明”))
titles.add(chars.toString());
}
公共无效字符(字符ch[],整数开始,整数长度){
append(新字符串(ch,start,length));
}
}
}
}
我是新来安卓的,我不知道在哪里换。
如果有人告诉我如何修复它,我将不胜感激。

请用oncreate方法编写此代码

ctx=这个

并删除此代码


(Activity)ctx.setContentView(R.layout.Activity_main)

当您从另一个线程更新ui时会发生这种情况。同时删除这个
((Activity)ctx).setContentView(R.layout.Activity_main)
。还有这个
“/xmlparserdenme/src/Database.xml”
你的数据库在哪里?xml?@Raghunandan,我的数据库是一个plist文件。文件的路径是什么。它在SD卡中吗?你不能在UI线程之外使用UI。谢谢,它解决了我的问题。现在我有另一个问题,你能看一下吗?[链接][link]