Java Android中的游戏线程执行未正确恢复

Java Android中的游戏线程执行未正确恢复,java,android,multithreading,Java,Android,Multithreading,我正在开发一个简单的游戏,它运行在自己的线程中。当我启动应用程序时,一切都很好。线程被初始化,更新和渲染函数从线程执行,这很好 如果退出应用程序,线程将暂停。当我再次启动应用程序时,线程恢复正常。执行更新和渲染功能。再说一次,这太棒了 问题是,我按下电源按钮使设备休眠。当我从该状态恢复应用程序时,渲染功能似乎工作正常;它将所有元素背景、精灵等精确地绘制在我按下按钮之前的位置。但是:精灵不再是动画!经过一点跟踪和故障排除,我发现尽管running标志设置为TRUE,但RUN函数似乎不再运行了!另一

我正在开发一个简单的游戏,它运行在自己的线程中。当我启动应用程序时,一切都很好。线程被初始化,更新和渲染函数从线程执行,这很好

如果退出应用程序,线程将暂停。当我再次启动应用程序时,线程恢复正常。执行更新和渲染功能。再说一次,这太棒了

问题是,我按下电源按钮使设备休眠。当我从该状态恢复应用程序时,渲染功能似乎工作正常;它将所有元素背景、精灵等精确地绘制在我按下按钮之前的位置。但是:精灵不再是动画!经过一点跟踪和故障排除,我发现尽管running标志设置为TRUE,但RUN函数似乎不再运行了!另一方面,我不明白为什么渲染函数可以工作,但更新函数不能,除非应用程序从其他方法渲染对象?不顾一切的

我从两个可能的角度研究这个问题;我要么在Android操作线程的方式上遗漏了什么,要么这与对象中的成员变量被重置的事实有关

有人能回顾一下我在下面发布的基本代码,并就如何改进线程操作提出建议吗?我是一个聪明的人,我读过很多关于这个问题的不同来源的文章,现在比以往任何时候都更加困惑!我在这条路上走对了吗,还是有更聪明的方法?我真的需要一个单独的游戏线程,还是可以用设备的主线程来运行它

谢谢你的反馈

public class GameThread extends Thread {
    private boolean running=false;
    private SurfaceHolder surfaceHolder;
    private GameView gameView;

    public GameThread(SurfaceHolder surfaceHolder, GameView gameView){
        super();
        this.surfaceHolder = surfaceHolder;
        this.gameView = gameView;
    }

    @Override
    public void run(){
        Canvas canvas;

        //  THIS ONLY RUNS ONCE!
        //  WHEN I TURN THE POWER OFF AND BACK ON, THE RUN() METHOD DOES NOT RUN!
        //  ODDLY ENOUGH, IF I WERE TO EXIT THE APP, AND GO BACK IN, IT WORKS FINE!
        //  THE running FLAG SEEMS TO CHANGE PROPERLY WHEN PAUSING OR RESUMING (SEE gameView, BELOW).
        while (running){
            canvas = null;
            try {
                canvas = this.surfaceHolder.lockCanvas();
                synchronized (surfaceHolder){
                    gameView.update();
                    gameView.render(canvas);
                }
            } finally {
                if (canvas!=null)
                    surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }
    public void setRunning(boolean running){
        this.running = running;
    }
}

public class GameView extends SurfaceView implements SurfaceHolder.Callback {
    private GameThread thread;
    private GameScreen gameScreen;

    public GameView(Context context) {
        super(context);
        gameScreen = new GameScreen(context);
        setFocusable(true);
        thread = new GameThread(getHolder(), this);
        getHolder().addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        thread = new GameThread(getHolder(), this);
        thread.setRunning(true);
        thread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        while (retry){
            try {
                thread.join();
                retry = false;
            } catch (InterruptedException e){
                // Do nothing; continue trying
            }
        }
    }

    public void render(Canvas canvas){
        gameScreen.draw(canvas);
    }   

    public void update(){   
        gameScreen.update();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        gameScreen.touch(event);
    }

    public void resume(){
        // TODO: Resume events go here
        thread.setRunning(true);
    }

    public void pause(){
        // TODO: Pause events go here
        thread.setRunning(false);
    }
}

public class GameScreen {
    public GameScreen(Context context){
        // Initialize private variables here
    }

    public void draw(Canvas canvas){
        // Draw events go here
    }

    public void update(){
        // Update events go here
    }

    public void touch(MotionEvent event){
        // Touch events go here
    }
}

在尝试发布画布之前,需要执行update方法。仍然不确定这是为什么,但它现在按预期工作

    Canvas canvas = null;
    while (running){
        gameView.update();

        try {
            canvas = this.surfaceHolder.lockCanvas();
            synchronized (surfaceHolder){

                gameView.render(canvas);
            }
        } finally {
            if (canvas!=null)
                surfaceHolder.unlockCanvasAndPost(canvas);
        }
    }
}