Java Android中的游戏线程执行未正确恢复
我正在开发一个简单的游戏,它运行在自己的线程中。当我启动应用程序时,一切都很好。线程被初始化,更新和渲染函数从线程执行,这很好 如果退出应用程序,线程将暂停。当我再次启动应用程序时,线程恢复正常。执行更新和渲染功能。再说一次,这太棒了 问题是,我按下电源按钮使设备休眠。当我从该状态恢复应用程序时,渲染功能似乎工作正常;它将所有元素背景、精灵等精确地绘制在我按下按钮之前的位置。但是:精灵不再是动画!经过一点跟踪和故障排除,我发现尽管running标志设置为TRUE,但RUN函数似乎不再运行了!另一方面,我不明白为什么渲染函数可以工作,但更新函数不能,除非应用程序从其他方法渲染对象?不顾一切的 我从两个可能的角度研究这个问题;我要么在Android操作线程的方式上遗漏了什么,要么这与对象中的成员变量被重置的事实有关 有人能回顾一下我在下面发布的基本代码,并就如何改进线程操作提出建议吗?我是一个聪明的人,我读过很多关于这个问题的不同来源的文章,现在比以往任何时候都更加困惑!我在这条路上走对了吗,还是有更聪明的方法?我真的需要一个单独的游戏线程,还是可以用设备的主线程来运行它 谢谢你的反馈Java Android中的游戏线程执行未正确恢复,java,android,multithreading,Java,Android,Multithreading,我正在开发一个简单的游戏,它运行在自己的线程中。当我启动应用程序时,一切都很好。线程被初始化,更新和渲染函数从线程执行,这很好 如果退出应用程序,线程将暂停。当我再次启动应用程序时,线程恢复正常。执行更新和渲染功能。再说一次,这太棒了 问题是,我按下电源按钮使设备休眠。当我从该状态恢复应用程序时,渲染功能似乎工作正常;它将所有元素背景、精灵等精确地绘制在我按下按钮之前的位置。但是:精灵不再是动画!经过一点跟踪和故障排除,我发现尽管running标志设置为TRUE,但RUN函数似乎不再运行了!另一
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);
}
}
}