只有创建视图层次结构的原始线程才能触及其视图 - FATAL EXCEPTION

时间:2013-10-27 11:06:08

标签: java android

我正在尝试使用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();

}

2 个答案:

答案 0 :(得分:1)

您需要调用runOnUiThread来更改线程中的布局。

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();
        }
    }
});

作为旁注,请确保您不对字符串进行硬编码,以避免拼写错误.-

Intent mainActivity = new Intent(YourActivity.this, android.intent.action.Homeview.class);

答案 1 :(得分:1)

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

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