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