我的MainActivity上有这段代码:
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = (float)(event.getX());
float y = (float)(event.getY());
if(y>=screenh/3&&y<(screenh/4)*2)
setContentView(g);
g是一个表面视图。当我点击屏幕上的这个特定位置时,我想将contentview设置为surfaceview,但它给了我&#34;线程已经开始&#34;例外:
@Override
public void surfaceCreated(SurfaceHolder holder) {
gameLoopThread.setRunning(true);
gameLoopThread.start();
}
如果我将onCreate的contentview设置为g,则没有错误。 为什么呢?
答案 0 :(得分:0)
&#34;线程已经开始&#34;因为在onTouchEvent()中调用setContentView(g)会调用surfaceCreated(),这会导致尝试再次启动该线程。
因此,您应该在启动之前检查线程的状态:
if (gameLoopThread.getState() == Thread.State.NEW){
gameLoopThread.start();
}
为什么呢?
因为根据java docs,一旦启动,线程可能无法重新启动。 意思是,你只能在一个实例上调用一次gameLoopThread.start()。
还要确保从MainActivity的onResume()和onPause()方法调用表面视图的resume()和pause()方法:
@Override
public void onResume() {
super.onResume();
g.resume();
}
@Override
public void onPause() {
super.onPause();
g.pause();
}