Android: закрытие активности в диалоговом окне - PullRequest
0 голосов
/ 14 января 2011

У меня странная ситуация, которую я вижу.

Я читаю некоторую информацию из базы данных, затем поднимаю диалог: ПСЕВДО

 val = DBaseManager.readValue(i,POS_ONE);

 if(val == 1)
 {
   Dialog_Test myDialog = new 
   Dialog_Test (myContext,"",new addListener(),DBaseManager);
   myDialog.show();
 }

как вы видите, я передаю в диалог DBaseManager, чтобы он мог также использовать его.

тогда я использую это так:

DBaseManager.readValue(k,POS_TWO);

и т.д.

Теперь это работает в 99% случаев, однако у меня были некоторые журналы сбоев, указывающие на эти строки в диалоге с исключениями нулевого указателя.

Для меня это означает, что на некоторых устройствах мои методы onPause или OnDestory вызываются в основном действии, которое закрывает и обнуляет DBaseManager. Это устройства 1.6, 2.2 и 2.3.

Итак, вопрос в том, почему и как это предотвратить? Я добавил несколько проверок нулевого указателя, чтобы предотвратить сбои, но это все еще далеко от идеала.

ОБНОВЛЕНИЕ: На моих устройствах, по крайней мере, когда я поворачиваю экран, активность перезапускается, и диалоговое окно исчезает - может ли это быть на некоторых диалоговых окнах остается ???

1 Ответ

0 голосов
/ 14 января 2011

Это, вероятно, зависит от области вашего диалога и от того, где в коде вы его открываете. Поведение по умолчанию состоит в том, что действие проходит жизненный цикл при изменении ориентации, если вы явно не обрабатываете изменения ориентации и не переопределяете onOrientationChanged. Возможно, вы захотите сделать что-то вроде поддержания состояния вашего диалога на уровне Activity (например, добавив логическое значение isDialogDisplayed в качестве переменной класса), а затем в onCreate или onResume проверьте это и снова откройте диалог.

Что касается очистки объекта DBaseManager, я сталкивался с подобными вещами. Большие объекты очищаются, когда вы этого не ожидаете (на эти объекты все еще есть указатели, но система каким-то образом обнуляет их). Я идентифицировал их в своих приложениях и был более осторожен. Вместо проверки на нуль и перезагрузки при нулевом значении только тогда, когда возможно, что ваш код мог обнулять переменную (или использовать ленивую загрузку), я бы всегда рассматривал этот объект, как если бы он был лениво загружен. Добавьте метод, который возвращает этот объект вместо прямого доступа к нему, и всегда проверяйте его на null и перезагружайте, если он есть.

Для обеих этих проблем вы можете переопределить все методы жизненного цикла этого действия и записать их в журнал. Не забудьте вызвать методы жизненного цикла базового класса в ваших переопределениях (т. Е. public void onPause() { super.onPause() ... и т. Д.)!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...