簡體   English   中英

從Android上的bundle中檢索數據時出現ClassCastException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM