2013-07-24 25 views
1

我最近在我的程序中收到了一個崩潰。使用logCat我確定崩潰是由於我的應用程序正在恢復時主要活動中的onRestoreInstanceState()中的代碼。 logcat的文件:在onRestoreInstanceState中綁定null?

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 

所述的碰撞發生在在下面的onRestoreInstanceState方法線mPanels = (Panel[]) inState.getParcelableArray("panelParcel");

這種方法已經穩健地爲我工作,直到此崩潰,我試圖找出爲什麼inState似乎沒有,我已經保存在它的對象(面板)的陣列。我很困惑,因爲它好像inState不包含我保存到它的panelParcel。

我從this question看到我通常應該使用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(); 
} 

回答

3

您水溼投Parcelable數組的數組Panel

casting Object array to Integer array error

+0

請記住,這絕大多數時間都適用 - 我在工作中剛剛獲得「幸運」的時間嗎? – CrimsonX

+0

我想你可能是正確的 - 將調查,這篇文章看起來是相當有益的,類似我的問題:http://stackoverflow.com/questions/10071502/read-writing-arrays-of-parcelable-objects – CrimsonX

+1

正如我一般來說,除非編譯器/解釋器「知道」SuperType []'實際上是DerivedType []',否則不能將'SuperType []'強制轉換爲'DerivedType []'。在你的情況下,解釋器不知道反序列化數組是'Panel'的數組。所以你需要轉換數組的每個元素或使用'Arrays.copyOf(a,a.length,Panel []。class);''哪裏'a'是'Parcelable [] a = inState.getParcelableArray(「panelParcel」)' 。 – JustAnotherCoder

0

看看這篇文章以獲取更多信息onSaveInstanceState() and onRestoreInstanceState()

「onRestoreInstanceState()重新創建活動時,它被打死後只調用OS」

,並從文檔:

莫ST的實現將簡單地使用的onCreate(捆綁),以恢復自己的狀態 ,但它有時是方便畢竟 初始化在這裏做它已經完成或允許子類來決定是否 使用您的默認實現。此 方法的默認實現會執行以前由onSaveInstanceState(Bundle)凍結的任何視圖狀態的還原。

而且這個答案可能會有所幫助https://stackoverflow.com/a/2909211/1241244

+0

我同意你的 - 我甚至在我的問題提到的,我要開始使用'的onCreate'代替'onRestoreInstanceState',但仍犯規回答我的問題。 – CrimsonX

相關問題