سؤال

I recently received a crash in my program. Using logCat I determined that the crash was due to code in my onRestoreInstanceState() in the main activity when my app is being resumed. Logcat file:

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

The crash occurs on the line mPanels = (Panel[]) inState.getParcelableArray("panelParcel"); in the onRestoreInstanceState method below.

This methodology has worked robustly for me until this crash, and I'm trying to figure out why the inState appears to not have the array of objects (Panels) that I've saved in it. I'm confused because it seems like the inState doesnt include the panelParcel that I've saved to it.

I see from this question I should typically be using onCreate instead of onRestoreInstanceState, but I'd love to understand why this wouldnt work in a rare case, perhaps I dont fully understand something about the Activity Lifecycle?

Code for both Save and Restore Instance State:

@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();
}
هل كانت مفيدة؟

المحلول

You cann't cast array of Parcelable to array of Panel.

See casting Object array to Integer array error

نصائح أخرى

Take a look at this post for more information onSaveInstanceState () and onRestoreInstanceState ()

"onRestoreInstanceState() is called only when recreating activity after it was killed by the OS"

and from the documentation:

Most implementations will simply use onCreate(Bundle) to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation. The default implementation of this method performs a restore of any view state that had previously been frozen by onSaveInstanceState(Bundle).

Also this answer might be helpful https://stackoverflow.com/a/2909211/1241244

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top