2013-02-20 65 views
1

这是我第一次创建Android游戏。游戏通过SurfaceView运行。从线程类别开始另一个活动

这是SurfaceView

public class GameView extends SurfaceView implements SurfaceHolder.Callback 
{ 
    private GameThread game_thread; 

    public GameView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     SurfaceHolder sh = getHolder(); 
     sh.addCallback(this); 
     setFocusable(true); 

     game_thread = new GameThread(sh, context, new Handler()); 
    } 

    public void surfaceCreated(SurfaceHolder holder) 
    { 
     game_thread.start(); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     game_thread.stop(); 
    } 
} 

运行游戏是这样的线程。

public class GameThread extends Thread 
{ 
    public GameThread(SurfaceHolder sh_arg, Context c, Handler h) 
    { 
     sh = sh_arg; 
     context = c; 
    } 

    @Overide 
    public void run() 
    { 
     super.run(); 
     while(!dead) 
     { 
      // Update here 
     } 
     // Game Over. Start another activity from here to show player score. 
    } 
} 

到目前为止,我设法让它开始另一项活动的唯一方法就是在循环之后添加它。

context.startActivity(new Intent(context, GameOver.class)); 

活动确实开始并显示,但冻结并导致ANR。

我猜测,从一个线程开始一个活动并不是一个好主意,还有更好的替代方法。

+0

如果活动冻结你应该张贴相关活动代码,而不是代码与其他随机类 – Blackbelt 2013-02-20 14:46:36

+0

运行新的活动(我将通过意向做)之前,我会建议,阻止你的线程运行,因为这可能是导致页面崩溃的原因,因为它仍然试图运行线程,但无法找到它。 – 2013-02-20 14:51:38

回答

0

当您实例化并启动线程时,您可以从主线程(也是UI线程)执行此操作。有了这个,你有一个UI线程和后台线程。现在,当您想从第二个线程启动另一个UI线程(通过启动另一个活动)时,因为您已经有了另一个使用UI线程的活动,您会遇到问题。您不能同时运行两个活动。

0

尝试使用

((Activity)context).runOnUiThread(new Runnable(){ 

    public void run() 
    { 
    context.startActivity(new Intent(context, GameOver.class)); 
    } 
    });