Я могу приостановить/возобновить свою игру, заставив свой игровой поток (который удерживает/синхронизируется с представлением поверхности) ждать/уведомлять всех. Все это хорошо работает с помощью кнопки паузы в игре.
Однако, когда я нажимаю кнопку «Домой/Назад», я могу приостановить свою игру, но когда я возобновляю игру, щелкнув ее значок, я получаю не отвечающий экран игры.
Я поместил журналы в метод OnResume(), но в LogCat ничего не печатается! Если я нажимаю на свой игровой экран, я получаю диалоговое окно с сообщением об ошибке «Принудительно закрыть» или «Подождите» в моей игровой активности.
Почему я получаю этот невосприимчивый экран, как будто мое приложение зависло после паузы? Как я могу обрабатывать физические кнопки так же, как кнопку паузы/возобновления в игре?
вот мой вид logcat операции. вы можете видеть, что onResume sop не печатается, как onPause.
РЕДАКТИРОВАТЬ: код, вызываемый моей кнопкой паузы/возобновления и функциями onPause/onResume, где «это» является самим классом потока
protected void setPause(){
synchronized (this) {
isPaused = true;
}
}
protected void setResume(){
synchronized (this) {
isPaused = false;
this.notifyAll();
}
}
Код игрового цикла:
synchronized (this) {
while (running) {
if (isPaused) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
Canvas c = null;
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.onDraw(c);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = ticksPS
- (System.currentTimeMillis() - startTime);
try {
if (sleepTime > 0)
sleep(sleepTime);
else
sleep(10);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Вот как я называю это с поверхности:
public void surfaceCreated(SurfaceHolder holder) {
// start the game loop
System.out.println("Starting Game Loop @@@@@@@@@");
if(isPaused){
System.out.println("GamePaused");
gameLoopThread.setResume();
}
else{
System.out.println("Game Starting");
gameLoopThread.setRunning(true);
}
gameLoopThread.start();
}
РЕДАКТИРОВАТЬ 2: Если я ставлю игру на паузу с помощью кнопки паузы и позволяю моему телефону автоматически заблокироваться... после возобновления я могу нормально играть без каких-либо проблем. Согласно журналам, я вижу, что разрушенная поверхность в этом случае не вызывается.