Нулевой пакет в onRestoreInstanceState?
Я недавно получил сбой в моей программе. Используя logCat, я определил, что сбой произошел из-за кода в моем onRestoreInstanceState()
в основной деятельности, когда мое приложение возобновляется. Файл LogCat:
07-23 16:27:01.927 I/ActivityManager( 390): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.myapp/.MainActivity bnds=[1184,809][1376,1001]} from pid 30666
07-23 16:27:01.997 I/ActivityManager( 390): Start proc com.myapp for activity com.myapp/.MainActivity: pid=31007 uid=10070 gids={50070, 1028}
07-23 16:27:02.137 E/AndroidRuntime(31007): FATAL EXCEPTION: main
07-23 16:27:02.137 E/AndroidRuntime(31007): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.MainActivity}: java.lang.ClassCastException: android.os.Parcelable[] cannot be cast to com.myapp.Panel[]
07-23 16:27:02.137 E/AndroidRuntime(31007): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
07-23 16:27:02.137 E/AndroidRuntime(31007): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-23 16:27:02.137 E/AndroidRuntime(31007): at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-23 16:27:02.137 E/AndroidRuntime(31007): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-23 16:27:02.137 E/AndroidRuntime(31007): at android.os.Handler.dispatchMessage(Handler.java:99)
07-23 16:27:02.137 E/AndroidRuntime(31007): at android.os.Looper.loop(Looper.java:137)
07-23 16:27:02.137 E/AndroidRuntime(31007): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-23 16:27:02.137 E/AndroidRuntime(31007): at java.lang.reflect.Method.invokeNative(Native Method)
07-23 16:27:02.137 E/AndroidRuntime(31007): at java.lang.reflect.Method.invoke(Method.java:511)
07-23 16:27:02.137 E/AndroidRuntime(31007): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-23 16:27:02.137 E/AndroidRuntime(31007): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-23 16:27:02.137 E/AndroidRuntime(31007): at dalvik.system.NativeStart.main(Native Method)
07-23 16:27:02.137 E/AndroidRuntime(31007): Caused by: java.lang.ClassCastException: android.os.Parcelable[] cannot be cast to com.myapp.Panel[]
07-23 16:27:02.137 E/AndroidRuntime(31007): at com.myapp.MainActivity.onRestoreInstanceState(MainActivity.java:177)
07-23 16:27:02.137 E/AndroidRuntime(31007): at android.app.Activity.performRestoreInstanceState(Activity.java:910)
07-23 16:27:02.137 E/AndroidRuntime(31007): at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1131)
07-23 16:27:02.137 E/AndroidRuntime(31007): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158)
07-23 16:27:02.137 E/AndroidRuntime(31007): ... 11 more
07-23 16:27:02.167 W/ActivityManager( 390): Force finishing activity com.myapp/.MainActivity
Авария происходит на линии mPanels = (Panel[]) inState.getParcelableArray("panelParcel");
в методе onRestoreInstanceState ниже.
До этого сбоя эта методология работала для меня надежно, и я пытаюсь выяснить, почему в inState отсутствует массив объектов (панелей), который я сохранил в нем. Я запутался, потому что кажется, что inState не включает в себя панель Panel, которую я сохранил.
Я вижу из этого вопроса, который я обычно использую onCreate
вместо onRestoreInstanceState
, но я бы хотел понять, почему это не сработает в редком случае, возможно, я не совсем понимаю что-то о жизненном цикле активности?
Код для сохранения и восстановления состояния экземпляра:
@Override
public void onSaveInstanceState(@NotNull Bundle outState)
{
Log.d("panelCreation", "onSaveInstanceState Called");
super.onSaveInstanceState(outState);
// save the current panel state
outState.putParcelableArray("panelParcel", mPanels);
}
@Override
public void onRestoreInstanceState(Bundle inState)
{
Log.d("panelCreation", "onsState Called");
super.onRestoreInstanceState(inState);
// Note getParcelable returns a *new* array, so we must setup the drawer listener after this
mPanels = (Panel[]) inState.getParcelableArray("panelParcel");
// set up the drawer's list view with items and click listener
mDrawerList.setAdapter(new PanelArrayAdapter(this,
R.layout.drawer_list_item, mPanels));
refreshDrawerListChecked();
// Forces the Adapter to redraw the view to ensure color stylings are applied
((PanelArrayAdapter)mDrawerList.getAdapter()).notifyDataSetChanged();
}
2 ответа
Вы не можете разыграть массив Parcelable
к массиву Panel
,
Взгляните на этот пост для получения дополнительной информации о onSaveInstanceState () и onRestoreInstanceState ()
"onRestoreInstanceState () вызывается только при воссоздании активности после того, как она была уничтожена ОС"
и из документации:
Большинство реализаций просто используют onCreate(Bundle) для восстановления своего состояния, но иногда бывает удобно сделать это здесь после того, как была выполнена вся инициализация, или чтобы подклассы могли решить, использовать ли реализацию по умолчанию. Реализация этого метода по умолчанию выполняет восстановление любого состояния представления, которое ранее было заморожено с помощью onSaveInstanceState(Bundle).
Также этот ответ может быть полезным /questions/17310197/kak-sohranit-sostoyanie-aktivnosti-android-s-pomoschyu-sohraneniya-sostoyaniya-ekzemplyara/17310222#17310222