Игра вылетает при включенном экране пароля устройства - PullRequest
1 голос
/ 12 апреля 2011

При использовании Microsft Exchange Android активирует экран с паролем, который должен пройти пользователь при каждом включении устройства.

Я делаю игру, использующую SurfaceView, управляемую потоком. Я использую много статических переменных. Если устройство выключается во время игры, когда я возвращаюсь и ввожу пароль, игровой экран отображается, но с некоторыми растровыми изображениями неправильного размера и зависает.

В журналах я вижу сначала исключение NullPointerException с потоком, не связанным с пользовательским интерфейсом, а затем ошибку ANR. Похоже, что отключение устройства уничтожило некоторые объекты моего приложения, но оно не прошло onCreate и конструктор SurfaceView снова, когда он вернулся.

У меня нет проблем при приостановке игры с помощью телефонного звонка или нажатии кнопки ДОМОЙ. Также на двух других устройствах игра работает нормально после выключения и включения в середине игры, но у них нет экрана безопасности.

Я использую Galaxy Tab, OS 2.2

EDIT: После печати в стеке трассировки я получаю

android.graphics.Canvas.throwIfRecycled

Кажется, что некоторые из моих растровых изображений были переработаны. Любая идея, как обнаружить это в onResume или в SurfaceChanged (), который всегда срабатывает при возвращении в приложение?

1 Ответ

0 голосов
/ 15 мая 2011

В данный момент мое решение этой проблемы - закрыть это действие, если оно не возобновлено с правильной последовательностью событий. Если onSurfaceChanged происходит без предварительного onSurfaceCreated, то закройте это действие. Состояние игры все еще можно сохранить, и когда игрок возобновит это действие, оно продолжится там, где остановилось.

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {

        //if it does not start through surfaceCreated close activity
       // because some bitmaps could be recycled and crash the application
        if (!surfaceCreatedFirst){
            _thread.setRunning(false); //stop the thread
            ((Activity) context1).finish(); //close activity
        }   

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        surfaceCreatedFirst = true;
        _thread = new FootballThread(holder, this);
        _thread.setRunning(true);
        _thread.start(); 
    }
...