2012-06-24 69 views
0

我有一個自定義視圖,其是由它們的碎片稱爲內部的兩個輔助方法:Android的捆綁和ClassCastException異常

public Bundle returnInstanceState() { 
     Bundle state = new Bundle(); 
     state.putSerializable("colorData", colorData); 
     return state; 
} 

public void loadInstanceState(Bundle savedInstanceState) { 
    if(savedInstanceState.getSerializable("colorData") != null) 
      colorData = (int[][]) savedInstanceState.getSerializable("colorData"); 
} 

colordata的生命週期:

private int[][] colorData; 

protected void onSizeChanged (int w, int h, int oldw, int oldh) 
{ 
    width = w; 
    height = h; 
    screen = new int[width*height]; 
    cellSize = 0; 
    if(firstLoad && h!= 0 && w!=0) 
    { 

    if(nWidth>nHeight) 
     colorData = new int[nWidth/(nHeight/170 - 1) + 1][170]; 
    else 
      colorData = new int[nHeight/(nWidth/170 - 1) + 1][170]; 
     firstLoad = false; 
    } 
} 

nWidthnHeight是代表靜態INT原始分辨率。

但是,一旦在藍色的月亮,我給了一個ClassCastException。爲什麼?

從我的測試看來,你可以投nullint[][]雖然這實際上不是我的目標。 colorDataint[][]類型,我從來沒有在任何地方得到NullPointerException,因爲據我所知,除了鑄造Serializableint[][]之外的所有工作,並且只是偶爾。

這裏是一個堆棧跟蹤,但它是不是在這種情況下多大的用處:

java.lang.RuntimeException: Unable to start activity ComponentInfo{<MYPACKAGENAMEHERE>/<MYPACKAGENAMEHERE>.MusicVisualizerActivity}: java.lang.ClassCastException: [Ljava.lang.Object; 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:121) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3701) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassCastException: [Ljava.lang.Object; 
    at <MYPACKAGENAMEHERE>.Visualization_Spectral$RenderView.loadInstanceState(Visualization_Spectral.java:95) 
    at <MYPACKAGENAMEHERE>.Visualization_Spectral.onCreateView(Visualization_Spectral.java:46) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:870) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1810) 
    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:501) 
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129) 
    at android.app.Activity.performStart(Activity.java:3791) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1632) 
    ... 11 more 
java.lang.ClassCastException: [Ljava.lang.Object; 
    at <MYPACKAGENAMEHERE>.Visualization_Spectral$RenderView.loadInstanceState(Visualization_Spectral.java:95) 
    at <MYPACKAGENAMEHERE>.visualization.Visualization_Spectral.onCreateView(Visualization_Spectral.java:46) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:870) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1810) 
    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:501) 
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129) 
    at android.app.Activity.performStart(Activity.java:3791) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1632) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:121) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3701) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

你可以添加colorData的聲明嗎? – Ixx

+0

絕對,一刻 – ebolyen

+0

我編輯了帖子 – ebolyen

回答

0

Serializable接口,如果破綻百出,應該儘量避免,尤其是在Android系統。從代碼的外觀來看,您只是暫時將此對象傳遞到Bundle,因此可以重新創建一個Activity或其他組件,如果沒有其他內容,則序列化該對象將提供較差的性能來滿足這種臨時需求。

如果您處於Activity的環境中,API onRetainNonConfigurationInstance()及其對應的getLastNonConfigurationInstance()將是一種更有效的方法來傳遞該對象。如果您使用的是Fragment API,請參閱setRetainInstance()方法。

HTH

0

對於我來說,因爲Java(多維)數組是由默認可序列化看起來怪怪的(還是我錯了?)。但看起來,至少在Android中,這有些不同。

你反正應該通過使用Parcelable。實現起來有些繁瑣,但比Serializable更快...下面是一個howto:Passing multidimensional array using Serializable

+0

,這也是我的理解,因爲如果數組是自動包裝到它們各自的對象包裝中,如果它們是原始的,就像在這種情況下 – ebolyen