Мне смоделировали приложение для Android после LunarLander
пример Google. Я отлаживаю его на физическом устройстве, (Motorola Droid
) с Android 2.0
. Когда ориентация изменяется, катастрофические отказы программы на a NullPointerException
. Logcat от непосредственно перед катастрофическим отказом:
02-01 00:24:27.956: DEBUG/nate(8358): Starting Game
02-01 00:24:36.878: DEBUG/dalvikvm(1086): GC freed 1788 objects / 92256 bytes in 1389ms
02-01 00:24:38.542: INFO/WindowManager(1021): Setting rotation to 1, animFlags=0
02-01 00:24:38.558: INFO/ActivityManager(1021): Config changed: { scale=1.0 imsi=310/4 loc=en_US touch=3 keys=2/1/2 nav=2/2 orien=2 layout=34}
02-01 00:24:38.620: WARN/UsageStats(1021): Something wrong here, didnt expect org.nifong.leeder to be resumed
02-01 00:24:38.886: DEBUG/nate(8358): New Surface dimensions: 854x442
02-01 00:24:38.886: DEBUG/nate(8358): flies was null
Первая строка, которая волнует меня, "Something wrong here"
в 24:38.620
. Я понятия не имею, что это означает, но я думаю его должное мне не реагирующий правильно на экранное изменение.
Затем я получаю сообщение отладки, которое я распечатал сам из моего собственного метода surfaceChanged()
о новых поверхностных размерах.
Затем я распечатываю сообщение отладки о том, были ли мухи null
. flies
поле, которое в конечном счете вызывает NullPointerException
. Ее созданный однажды, и никогда писавшийся в снова для остальной части программы. Я знаю, что это не было пустым перед катастрофическим отказом, потому что это несколько раз читалось.
У кого-либо есть подсказка, как моя переменная члена парламента, не занимающего официального поста стала пустой только этими подсказками?
Я включал бы код, но существует многое из него, и я не знаю то, что было бы релевантно.
Я исправил это, добавив эти две строки к тегу активности в моем файле-манифесте
android:configChanges="keyboardHidden|orientation"
android:screenOrientation="landscape"
это говорит о том, что мое приложение будет самостоятельно обрабатывать изменения клавиатуры и ориентации (ничего не делая) и предпочитает постоянно работать в альбомном режиме.
Изменения ориентации в Android влияют на состояние. В основном, ваша деятельность уничтожена и воссоздана. Поэтому вы должны знать, какие события жизненного цикла Android будут вызываться и как сохранить состояние.
Также необходимо быть осторожным в отношении статических
экземпляров и того, как это влияет на этот жизненный цикл.
Вот запись в блоге , объясняющая это.