2013-02-20 3 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

+0

я бы посоветовал перед запуском нового процесса (я хотел бы сделать это с помощью Intent), чтобы остановить работу вашего потока, поскольку это может быть причиной того, что страница Crash вызывает попытку запуска потока, но не может ее найти. –

ответ

0

Когда вы создаете экземпляр и запускаете нить, вы делаете это из основного потока, который также является потоком пользовательского интерфейса. При этом у вас есть поток пользовательского интерфейса и фоновый поток. Теперь, когда вы хотите запустить другой поток пользовательского интерфейса (путем запуска другого действия) из второго потока, поскольку у вас уже есть другое действие с потоком пользовательского интерфейса, у вас возникает проблема. Вы не можете одновременно запускать две операции.

0

Попробуйте использовать

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

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