ClassCastException occurs randomly to restore Vector in onRestoreInstanceState(). Generally restoring vector is finished well, but sometimes exception occurs.
I think it happens when activity is went to background and destroyed but I'm not sure.
Any ideas? Thank you.
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);
}
ADDED:
I forgot to attach exception log. That is
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Stack
I use next code to restore Vector:
objects = new Vector<Object>((Collection<Object>) state.getSerializable(EXTRA_OBJECTS));
It prevents java.lang.ClassCastException and saves elements order.
To restore Stack, you can use next code:
stack = new Stack<Object>();
stack.addAll((Collection<Object>) state.getSerializable(EXTRA_STACK));
It works due to Vector, Stack, ArrayList are extending Collection, and you can cast your serialized object to Collection and pass to Stack or Vector addAll() method.
This typically happens when the activity has been destroyed because of memory pressure. The bundle passed to onRestoreInstanceState seems to retain an instance of the base class (ArrayList
in this case).
You may be able to reproduce the issue by tweaking the developer options:
Now your activity will be destroyed immediately after you leave it. Launching the activity in question, pressing the Home button, and then switching back to your app should trigger the ClassCastException
.
In the meantime, Ted Hopp's suggestion to use
if (saved instanceof Stack) {
....
}
should avoid crashing the app.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With