2013-02-20 48 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)); 
    } 
    });