Java 只有创建视图层次结构的原始线程才能接触其视图-致命异常

Java 只有创建视图层次结构的原始线程才能接触其视图-致命异常,java,android,Java,Android,我试图使用setContentView方法将我的视图置于最前面,但这样做会导致此错误 从这里搜索类似的问题,我发现这个错误通常是在尝试获取/设置布局视图对象的值时产生的,例如,没有实例化它,但这里不是这样,我甚至无法设置视图 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ticker); Thr

我试图使用setContentView方法将我的视图置于最前面,但这样做会导致此错误

从这里搜索类似的问题,我发现这个错误通常是在尝试获取/设置布局视图对象的值时产生的,例如,没有实例化它,但这里不是这样,我甚至无法设置视图

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ticker);
    Thread tmr = new Thread() {
        public void run() {
            try {
                sleep(1000);
            } catch (InterruptedException iEx) {
                iEx.printStackTrace();
            } finally {
                User usrObj = new User();
                if (usrObj.authenticateUser()) {

                    Intent mainActivity = new Intent(
                            "android.intent.action.Homeview");
                    startActivity(mainActivity);
                } else {
                    setContentView(R.layout.login); // <- ERROR
                    activateLogin();
                }
            }
        }

    };
    tmr.start();

}
您需要调用以从线程更改布局

runOnUiThread(new Runnable() {
    @Override
    public void run() { 
        User usrObj = new User();
        if (usrObj.authenticateUser()) {
            Intent mainActivity = new Intent("android.intent.action.Homeview");
            startActivity(mainActivity);
        } else {
            setContentView(R.layout.login); // <- ERROR
            activateLogin();
        }
    }
});

您正在调用setContentView。。。从非UI线程。将其移动到主UI线程或将单个调用包装到:

runOnUIThread(new Runnable() {
    @Override
    public void run() {
        setContentView(R.layout.login);
    }
});

与UI相关的操作只能由UI线程处理。您正在新线程中设置视图。使用线程中的消息处理程序将信息传递给UI线程,或者使用AsynTask!您是对的,但是使用独立线程的目的是减轻主线程上的压力和瓶颈。所以runOnUiThread块应该只包装必须在主线程上执行的调用。@NitroNbg你说得对。无论如何,这个场景看起来不像是性能问题,线程只是用来延迟下一个活动的启动,很可能这是启动屏幕的代码。
runOnUIThread(new Runnable() {
    @Override
    public void run() {
        setContentView(R.layout.login);
    }
});