Нулевой пакет в 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

Другие вопросы по тегам