5

onSaveInstanceState()

// departures is instance of Departures which extends ArrayList
bundle.putSerializable("departures", departures);

onRestoreInstanceState

departures = (Departures) state.getSerializable("departures");

画面を回転させると、アクティビティが再起動され、状態が復元されます。それは正常に動作します。アクティビティを離れると、しばらくすると Android がアクティビティをメモリから削除し、その状態を保存します。私がそれに戻ると、クラッシュしonRestoreInstanceStateます:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to cz.fhejl.pubtran.Departures

getSerializable現在はArrayListではなく、 が返されDeparturesます。

編集: Departures.java の外観は次のとおりです: http://pastebin.com/qc3QfrK7

4

2 に答える 2

6

表示される問題は、Android がオブジェクトをフラット化する方法が原因です。内部的にはParcel#writeValue(Object)、 if/else の長いチェーンを持つ which が呼び出され、if (o instanceof List)が前に来instanceof Serializableます。DeparturesであるためList、代わりにリストとして配置し、データを分割解除するときに、それが特別な種類のリストであることを知りません。

Listその問題を回避するには、 a を拡張しないものを使用する必要があります。

于 2012-09-08T22:46:01.193 に答える
4

私はこれに少し遅れていることを知っていますが、シリアライズ可能な配列で同様の問題に遭遇しました。

独自のプライベート クラス内に配列をラップすることで機能させました。

private class ArrayHolder implements Serializable{
  public Serializable[] _myArray;
  public ArrayHolder(Serializable myArray){
    _myArray = myArray;
  }
}

それから私がしたことはすべて保存することでした

bundle.putSerializable("name",new ArrayHolder(arrayToBeSaved));

デシリアライズ時:

ArrayHolder arrayHolder = (ArrayHolder) bundle.getSerializable("name");
arrayRecovered = arrayHolder._myArray;

なぜ機能するのかわかりませんが、機能します。

于 2012-10-15T15:48:09.493 に答える