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になります。

スレッドからアクティビティを開始することは実際には良い考えではなく、より良い代替方法があると思います。

4

2 に答える 2

0

スレッドをインスタンス化して開始するときは、UI スレッドでもあるメイン スレッドから実行します。これで、UI スレッドとバックグラウンド スレッドができました。ここで、別の UI スレッドを (別のアクティビティを開始することによって) 2 番目のスレッドから起動したい場合、UI スレッドで別のアクティビティが既にあるため、問題が発生します。2 つのアクティビティを同時に実行することはできません。

于 2013-02-20T14:55:05.423 に答える