SurfaceHolder.lockCanvas() pour Retourner la valeur null

Je suis en train de faire un jeu, et depuis, je suis nouveau sur Android, je me suis basé la conception de l'exemple LunarLander code. Dans sa conception, GameThread.doStart() est appelé à partir de GameActivity, et le thread s'exécute tout de son GameThread.run() boucle comme indiqué ci-dessous (une grande partie du code a été supprimé pour plus de clarté):

public class GameActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        gameView = new GameView(this);
        fl = new FrameLayout(this);
        fl.addView(gameView);

        setContentView(fl);

        gameThread = gameView.getThread();
        gameThread.doStart();
    }
}

.

class GameThread extends Thread
{
    public void doStart()
    {
    }

    public void run()
    {
        while (running)
        {
            Canvas c = null;
            try
            {
                c = mSurfaceHolder.lockCanvas();
                //Use canvas
            }
            finally
            {
            }
        }
    }
}

Pour essayer de résoudre certains problèmes que j'ai été en cours d'exécution en j'ai essayé de mettre plus de contrôle dans les mains de GameActivity, comme indiqué ci-dessous:

public class GameActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        gameView = new GameView(this);
        fl = new FrameLayout(this);
        fl.addView(gameView);

        setContentView(fl);

        gameThread = gameView.getThread();

        while (gameThread.isRunning())
        {
            gameThread.run();
        }
    }
}

.

class GameThread extends Thread
{
    public void doStart()
    {
    }

    public void run()
    {
        Canvas c = null;
        try
        {
            c = mSurfaceHolder.lockCanvas();
            //Use canvas
        }
        finally
        {
        }
    }
}

Sauf quand je fais ça lockCanvas() renvoie toujours null, et donc je ne peux pas dessiner quoi que ce soit à l'écran. Comme je l'ai dit je suis encore nouveau pour Android donc je n'ai aucune idée pourquoi le deuxième cas n'est pas de travail. Quelqu'un sait ce qu'il se passe et pourquoi cela ne fonctionne pas?

MODIFIER: De ce que j'ai testé, la surface n'est jamais créé. Au cours de GameView.onResume() j'avais l'activité attendez que la surface soit être créé avant de passer sur le jeu, mais il attendait toujours. Comment se fait-le premier exemple est le seul cas où la surface est créée?

OriginalL'auteur Jesse Jashinsky | 2011-08-03