Изменения в ориентации вызывают приложение к FC - PullRequest
0 голосов
/ 16 января 2012

Я работаю над приложением, которое сканирует штрих-коды, когда оно получает успешное сканирование, оно покажет диалоговое окно с кодом, который был отсканирован, и в зависимости от того, что содержалось в штрих-коде или QR-коде, оно покажет кнопку, чтобы открыть браузер, отправка SMS и т. д. Когда отображается диалоговое окно, при изменении ориентации экрана происходит сбой. У меня все работает так, что ориентация может измениться пару раз, прежде чем он падает, но когда я проверяю LogCat, он говорит, что исключение NullPointerException вызывает FC. До того, как я реализовал предложения @ CommonsWare, я мог заставить его вращаться произвольное количество раз перед сбоем, но так как я реализовал их, то FC на втором изменении ориентации всегда. Когда я запускаю это в debug mode, я могу поворачивать телефон столько раз, сколько захочу и так быстро, как хочу, но как только я запускаю его в обычном режиме, он всегда вылетает.

Поле класса:

private String currentType;

Я реализовал onSaveInstanceState():

@Override
public void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);    
    outState.putString("savedType", currentType);
}

Также onRestoreInstanceState():

@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
    super.onRestoreInstanceState(savedInstanceState);
    currentType = savedInstanceState.getString("savedType");
}

Обновление


Я обновил приведенный выше код до того, каким он является в настоящее время, следуя советам @ CommonsWare. Я также отредактировал свой пост на честность.

Я также использую CM7 (версия Android - 2.3.7, версия ядра - 2.6.37.6-cyanogenmod-g0799e00 android @ portatile # 1, версия мода - CyanogenMod-7-11152011-NIGHTLY-N1, номер сборки - GWK74 ).

1 Ответ

1 голос
/ 16 января 2012

В onPause () я использовал this.onRetainNonConfigurationInstance (), чтобы попытаться исправить это, но, похоже, это не имело значения.

Вы не звоните onRetainNonConfigurationInstance(). Android звонит onRetainNonConfigurationInstance().

Полагаю, мне также кажется, что это должно работать, согласно всем сообщениям, которые я читал об обработке изменений ориентации.

Вам нужно использовать лучшие источники.

Чтобы попытаться восстановить ваш код:

Шаг # 1: Удалить атрибут android:configChanges из вашего <activity> в манифесте

Шаг № 2: Удалить ваш onConfigurationChanged() метод

Шаг # 3: либо переместите логику onResume() в onCreate() для заполнения currentType, либо не пытайтесь использовать currentType до onResume()

Еще лучше было бы заменить целое onRetainNonConfigurationInstance() / getLastNonConfigurationInstance() на onSaveInstanceState() / onRestoreInstanceState(), поместив String в Bundle.

Вот пример проекта , демонстрирующий использование onSaveInstanceState(). Вот пример проекта , демонстрирующий использование onRetainNonConfigurationInstance().

...