Игра вылетает при включенном экране пароля устройства

1

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

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

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

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

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

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

android.graphics.Canvas.throwIfRecycled

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

  • 0
    Трассировка стека действительно поможет. Ваша игра возобновляется при включении? Сохраняете ли вы какие-либо данные в базу данных / файл / настройки?
  • 0
    Опубликуйте, что вы получаете в журналах, чтобы мы могли что-то выяснить
Теги:
surfaceview

1 ответ

0
Лучший ответ

В настоящее время мое решение этой проблемы заключается в закрытии этой операции, если она не возобновляется с правильной последовательностью событий. Если 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(); 
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню