我有一些状态,我希望在片段的生命周期中保存。例如,当屏幕旋转时,它工作正常,但是当从磁盘中杀死并恢复进程时(我认为它是如何工作的),我得到一个ClassCastException。 这是一些代码:
初始化:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
playlistsMap = new LinkedHashMap<Section, List<Playlist>>();
} else {
playlistsMap = (LinkedHashMap<Section, List<Playlist>>) savedInstanceState.getSerializable(PLAYLISTS_MAP_KEY);
}
setHasOptionsMenu(true);
}
保存数据:
@Override
public void onSaveInstanceState(Bundle outState) {
if (isEverySectionsLoaded()) {
outState.putSerializable(PLAYLISTS_MAP_KEY, playlistsMap);
} else {
outState.putSerializable(PLAYLISTS_MAP_KEY, new LinkedHashMap<Section, List<Playlist>>());
}
// ...
}
我从onCreate
中的演员表获得的例外:
04-10 01:06:43.430 E/AndroidRuntime(28549): FATAL EXCEPTION: main
04-10 01:06:43.430 E/AndroidRuntime(28549): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mydomain.android/com.mydomain.android.ui.MainActivity}:
java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.LinkedHashMap
我知道在Android上使用parcelables会更好,但我仍然不明白这是怎么回事。
有什么想法吗?
答案 0 :(得分:11)
有关类似问题的有趣读物可以找到here
任何实现java.util.List和java.io.Serializable的对象都将成为 intent.putExtra之后的ArrayList(EXTRA_TAG, suchObject)/ startActivity(意向)/intent.getSerializableExtra(EXTRA_TAG)。
我敢说同样重要的是实现可序列化和映射的任何东西。 HashMap是您将获得的默认值。
解决这个似乎是一个错误的解决方案类似于:
private LinkedHashMap<Section, List<Playlist>> playlistsMap;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
playlistsMap = new LinkedHashMap<Section, List<Playlist>>();
} else {
//assuming the bug returns a hashmap
Map<Section, List<Playlist>> items = (Map<Section, List<Playlist>>) savedInstanceState.getSerializable(PLAYLISTS_MAP_KEY);
//this way you can ensure you are working with a linkedHashMap.
//for the rest off the application
playlistsMap.putAll(items);
}
setHasOptionsMenu(true);
}
以上代码未经过测试但应该有效。 由于接口的使用,当错误得到修复时,此代码仍然有效。 因此,当您的客户端获得Android更新时,您可以放心,您的代码应该仍然执行相同操作,而不是崩溃并抱怨您无法将HashMap强制转换为LinkedHashMap。
答案 1 :(得分:-2)
问题是返回的引用不是对LinkedHashMap
实例的引用。如果函数Return LinkedHashMap
只返回LinkedHashMap
,则无法将其强制转换为HashMap。