8

onRestoreInstanceState() で Vector を復元するために 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
4

2 に答える 2

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

Vector、Stack、ArrayList が Collection を拡張しているため機能し、シリアル化されたオブジェクトを Collection にキャストして、Stack または Vector addAll() メソッドに渡すことができます。

于 2013-02-18T05:52:44.977 に答える
5

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

開発者向けオプションを微調整することで、問題を再現できる場合があります。

  1. [設定] | [設定] に移動します。開発者向けオプション
  2. 「アクティビティを保持しない」のチェックボックスをオンにします

これで、アクティビティを終了するとすぐにアクティビティが破棄されます。問題のアクティビティを起動し、ホーム ボタンを押してからアプリに戻ると、ClassCastException.

それまでの間、使用する Ted Hopp の提案

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

アプリのクラッシュを避ける必要があります。

于 2012-08-01T14:24:10.380 に答える