Android SurfaceView / Thread用于更新游戏状态

时间:2012-04-25 03:20:48

标签: android surfaceview

我正在Android上开发一款小游戏,我有一个问题。我希望我的主游戏循环是从SurfaceView调用的线程,但每次我想从这个线程调用另一个类的方法时,我得到“意外停止”消息。

更清楚:

@Override
public void run() { //Game Loop
   Canvas canvas = null;
   while (mRun) {               
      canvas = mHolder.lockCanvas();                
      if (canvas != null) {
         grub.updateGrubber();   //here I want to update state.                 
         mPanel.doDraw(canvas);
         mHolder.unlockCanvasAndPost(canvas);                   
      }
   }
}

行grub.updateGrubber();显示我之前提到的错误。我尝试了该类的不同方法,所有这些方法都给了我同样的错误。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果我的猜测是正确的,那么您正在尝试直接更新UI线程。您不能从主线程以外的线程调用UI方法。尝试:

Runnable action = new Runnable() {  
            @Override 
            public void run() {    

                grub.updateGrubber();  
                }     };
                this.post(action);
 instead of your `grub.updateGrubber();`  line.

答案 1 :(得分:1)

我实际上测试了你的建议,并不是一个坏主意,但我的代码中的问题是我从未真正创建过Grubber对象(我想念= new Grubber();部分)。< / p>

可能是与我在过去几周内完成的大量代码编写和测试相关的错误,对此感到抱歉。无论如何,我将使用创建的线程作为主游戏循环,根据我读过的here来更新surfaceview中的画布。