在Android上从bundle中检索数据时出现ClassCastException

我有一些状态,我希望在片段的生命周期中保存.例如,当屏幕旋转时,它工作正常,但是当从磁盘中杀死并恢复进程时(我认为它是如何工作的),我得到一个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会更好,但我仍然不明白这是怎么回事.

有任何想法吗?

解决方法

关于类似问题的有趣读物可以在 here找到

Any object that implements both java.util.List and java.io.Serializable will become
ArrayList after intent.putExtra(EXTRA_TAG,
suchObject)/startActivity(intent)/intent.getSerializableExtra(EXTRA_TAG).

我敢说同样重要的是实现可序列化和映射的任何东西. 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.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...