[英]ClassCastException when retrieving data from bundle on Android
我有一些狀態,我想在片段的生命周期中保存。 例如,當屏幕旋轉時,它工作正常,但是當從磁盤中殺死並恢復進程時(我認為它是如何工作的),我得到一個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
中的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會更好,但我仍然不明白這是怎么回事。
有任何想法嗎?
有關類似問題的有趣讀物可以在這里找到
任何實現java.util.List和java.io.Serializable的對象都將在intent.putExtra(EXTRA_TAG,suchObject)/ startActivity(intent)/intent.getSerializableExtra(EXTRA_TAG)之后變為ArrayList。
我敢說同樣重要的是實現可序列化和映射的任何東西。 HashMap是您將獲得的默認值。
圍繞這個似乎是一個bug的解決方案將類似於:
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。
問題是返回的引用不是對LinkedHashMap
實例的引用。 如果函數Return LinkedHashMap
只返回一個LinkedHashMap
,則無法將其強制轉換為HashMap。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.