Android: проблема с паузой/возобновлением игрового цикла

Я могу приостановить/возобновить свою игру, заставив свой игровой поток (который удерживает/синхронизируется с представлением поверхности) ждать/уведомлять всех. Все это хорошо работает с помощью кнопки паузы в игре.

Однако, когда я нажимаю кнопку «Домой/Назад», я могу приостановить свою игру, но когда я возобновляю игру, щелкнув ее значок, я получаю не отвечающий экран игры.

Я поместил журналы в метод OnResume(), но в LogCat ничего не печатается! Если я нажимаю на свой игровой экран, я получаю диалоговое окно с сообщением об ошибке «Принудительно закрыть» или «Подождите» в моей игровой активности.

Почему я получаю этот невосприимчивый экран, как будто мое приложение зависло после паузы? Как я могу обрабатывать физические кнопки так же, как кнопку паузы/возобновления в игре?

вот мой вид logcat операции. вы можете видеть, что onResume sop не печатается, как onPause.

Просмотр LogCat

РЕДАКТИРОВАТЬ: код, вызываемый моей кнопкой паузы/возобновления и функциями 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: Если я ставлю игру на паузу с помощью кнопки паузы и позволяю моему телефону автоматически заблокироваться... после возобновления я могу нормально играть без каких-либо проблем. Согласно журналам, я вижу, что разрушенная поверхность в этом случае не вызывается.


person Abhinav Tyagi    schedule 02.10.2012    source источник
comment
Что говорит ваш код OnResume и OnPause?   -  person Araw    schedule 02.10.2012
comment
проверьте мое обновление в сообщении под РЕДАКТИРОВАТЬ   -  person Abhinav Tyagi    schedule 02.10.2012
comment
Я предполагаю, что ваш метод приостановки игры каким-то образом спит в потоке пользовательского интерфейса. Это не способ сделать это. Покажите нам код, который выполняется, если игра приостановлена   -  person IncrediApp    schedule 02.10.2012
comment
Я добавил код в сообщение, пожалуйста, помогите!   -  person Abhinav Tyagi    schedule 02.10.2012


Ответы (1)


После onResume ваш SurfaceView создается снова, но он потерял все данные, которые у него были до этого (вся информация, необходимая для onDraw). вам нужно сохранить данные в surfaceDestroyed или ранее и перезагрузить их в onCreate вашего представления поверхности

person Tamir Scherzer    schedule 02.10.2012
comment
как я это сделал? У меня есть много случайных объектов, размещенных на экране. Как я смогу сохранить свое состояние для такого количества элементов? Должен ли я просто вызвать Finish() и попросить пользователей начать все сначала? - person Abhinav Tyagi; 02.10.2012
comment
Если я приостановлю свою игру с помощью кнопки паузы и позволю своему телефону автоматически заблокироваться, при возобновлении все работает хорошо !! - person Abhinav Tyagi; 02.10.2012
comment
используйте общие настройки для сохранения. если у вас есть массив объектов, я бы превратил его в JSONObject и сохранил как строку. - person Tamir Scherzer; 04.10.2012
comment
Можете ли вы показать мне в коде, как повторно использовать объекты при возобновлении кода? - person Abhinav Tyagi; 05.10.2012