重新设置contentView时线程已经启动

时间:2015-03-05 22:46:27

标签: java android

我的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,则没有错误。 为什么呢?

1 个答案:

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