0

カスタムビュー内に、フラグメントによって呼び出される2つのヘルパーメソッドがあります。

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;
    }
}

nWidthおよびnHeightは、ネイティブ解像度を表す静的intです。

しかし、ブルームーンに入ると、ClassCastExceptionが与えられます。なんで?

私のテストから、それは実際には私の目標ではありませんが、 nullあなたはキャストできるようです。は型であり、キャストする行為を除いてすべてが機能することがわかる限り、どこでもNullPointerExceptionを取得することはありません。int[][]colorDataint[][]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)
4

2 に答える 2

0

欠陥がたくさんある場合はSerializableインターフェースを使用します。特にAndroidでは、可能な限り避ける必要があります。コードの外観から、このオブジェクトを一時的に渡すだけなBundleので、アクティビティまたは他のコンポーネントを再作成できます。オブジェクトをシリアル化すると、そのような一時的なニーズに対してパフォーマンスが低下します。

APIonRetainNonConfigurationInstance()とそれに対応getLastNonConfigurationInstance()するものは、のコンテキストにいる場合、そのオブジェクトを渡すためのはるかに効率的な方法になりますActivityFragmentAPIを使用している場合は、setRetainInstance()メソッドも確認してください。

HTH

于 2012-06-24T23:38:25.463 に答える
0

Java(多次元)配列はデフォルトでシリアライズ可能であるため、私には奇妙に見えます(または私は間違っていますか?)。しかし、少なくともAndroidでは、これとは何かが違うようです。

とにかくParcelableを使用して合格する必要があります。実装するのはやや面倒ですが、Serializableよりも高速です...方法は次のとおりです。Serializableを使用して多次元配列を渡す

于 2012-06-24T23:51:24.787 に答える