Android SurfaceHolder.lockCanvas()返回null

Android SurfaceHolder.lockCanvas()返回null,android,surfaceholder,Android,Surfaceholder,我正在做一个游戏,因为我是Android新手,所以我根据这个例子进行设计。在其设计中,从GameActivity调用GameThread.doStart(),然后线程从其GameThread.run()循环运行所有内容,如下所示(为了清晰起见,大部分代码已被删除): 为了解决我遇到的一些问题,我尝试对游戏活动进行更多的控制,如下所示: public class GameActivity extends Activity { public void onCreate(Bundle sav

我正在做一个游戏,因为我是Android新手,所以我根据这个例子进行设计。在其设计中,从
GameActivity
调用
GameThread.doStart()
,然后线程从其
GameThread.run()
循环运行所有内容,如下所示(为了清晰起见,大部分代码已被删除):

为了解决我遇到的一些问题,我尝试对游戏活动进行更多的控制,如下所示:

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();
        }
    }
}

除非我这样做,
lockCanvas()
总是返回null,因此我无法在屏幕上绘制任何内容。正如我所说,我还是Android新手,所以我不知道为什么第二个案例不起作用。有人知道发生了什么或者为什么不起作用吗


编辑:根据我的测试,曲面从未创建过。在
GameView.onResume()
期间,我让活动在继续游戏之前等待曲面的创建,但它一直在等待。为什么第一个实例是创建曲面的唯一情况?

您正在创建时启动thred in活动,而只有在创建并准备好SurfaceView后才应启动该活动。检查第二个SurfaceView示例:

创建曲面后开始运行线程。i、 e.当您得到一个回调surfaceCreated()时,启动线程

代码片段

public void surfaceCreated(SurfaceHolder holder) {
    thread.setRunning(true);
    thread.start();
}

你的建议是我已经在做的。我只是没有显示代码。我不会在活动暂停时关闭线程,只是设置一个布尔标志,这样线程循环就不会调用任何方法。在恢复时,我再次重置此标志,动画继续。。。如果曲面被破坏,则“在曲面上创建”将在下次创建一个新线程。如果未创建曲面,您可以检测此情况并重新启动活动。@Lumis,创建曲面视图时我正在启动线程,但场景是我正在为摄影机设置PreviewDisplay(holder)。当我使用getHolder.lockCanvas()时,它总是带着相机回来,这正是我正在做的。
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
        {
        }
    }
}
public void surfaceCreated(SurfaceHolder holder) {
    thread.setRunning(true);
    thread.start();
}