2012-07-01 10 views
7

onRestoreInstanceState()でVectorを復元するためにClassCastExceptionがランダムに発生します。 一般的にベクトルの復元は正常に終了しますが、例外が発生することがあります。onRestoreInstanceStateでClassCastExceptionが発生する

アクティビティがバックグラウンドになって破壊されたときに発生すると思われますが、わかりません。

アイデア?ありがとうございました。

Stack<LocationInfo> mLocationInfoVector; 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putSerializable("locationInfos", mLocationInfoVector); 

    super.onSaveInstanceState(outState); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    if (savedInstanceState.getSerializable("locationInfos") != null) { 
     @SuppressWarnings("unchecked") 
     mLocationInfoVector= (Stack<LocationInfo>) savedInstanceState.getSerializable("locationInfos"); 
    } 

    super.onRestoreInstanceState(savedInstanceState); 
} 

を追加しました:

私は、例外ログを添付するのを忘れました。

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Stack 
+1

次のように 'onRestoreInstanceState'メソッドを書き直すことをお勧めします:' Object saved = savedInstanceState.getSerializable( "locationInfos"); if(stored instanceof Stack){mLocationInfoVector =(Stack )が保存されました。 }}} else if(saved!= null){Log.e( "RestoreBug"、 "復元されたオブジェクトクラス:" + saved.getClass()。getName()); } 'それで、少なくともあなたが戻ってくるものを見ることができます。 (コメントにコードを投稿して申し訳ありません;私はこれを回答として投稿したくありません)。 –

+0

私はそんなことを考えましたが、どのような仕組みがこのケースを作り出しているのか本当に知りたいのです。私は例外ログを追加しました。オブジェクト型がArrayListに変更された理由はわかりません。 – chris

+0

万が一、あなたのアクティビティスーパークラスが 'onSaveInstanceState'をオーバーライドしていますか?私はあなたのコードのどこにでも '' locationInfos "'キーを使っているのだろうかと思います。 (いずれにしても、 'onRestoreInstanceState'コードを再編成して' getSerializable() 'を1回だけ呼び出すようにしてください)。 –

答えて

5

私はベクトルを復元するために、次のコードを使用します。

objects = new Vector<Object>((Collection<Object>) state.getSerializable(EXTRA_OBJECTS)); 

それはjava.lang.ClassCastExceptionがを防ぎ、要素の順序が保存されます。スタックを復元するには

、あなたは次のコードを使用することができます。それが原因ベクタ、スタックに働く

stack = new Stack<Object>(); 
stack.addAll((Collection<Object>) state.getSerializable(EXTRA_STACK)); 

は、ArrayListのコレクションを拡張している、とあなたはコレクションにあなたのシリアライズされたオブジェクトをキャストし、スタックに渡すことができますまたはベクトルのaddAll () 方法。

+0

男の子、それは台無しだ。ありがとう。 –

4

これは、通常、メモリの負荷のためにアクティビティが破損した場合に発生します。 onRestoreInstanceStateに渡されたバンドルは、基本クラス(この場合はArrayList)のインスタンスを保持しているようです。

あなたは開発者向けのオプションを微調整することにより、問題を再現することができる場合があります設定に

  1. ゴー|開発者向けのオプション

「の活動を維持しない」のチェックボックスをオンにしますが今、あなたの活動は、あなたがそれを離れた直後に破棄されます。問題のアクティビティを起動し、[ホーム]ボタンを押してからアプリに戻ってClassCastExceptionをトリガーする必要があります。

一方で、

if (saved instanceof Stack) { 
    .... 
} 

を使用するには、テッドのHoppの提案は、アプリをクラッシュを避ける必要があります。

+0

私はまだ値をバンドルに保存しているが、タイプが変更されているという仕組みを知らない。 – chris

関連する問題