8

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

有任何想法吗?

4

2 回答 2

11

可以在此处找到有关类似问题的有趣阅读

任何同时实现 java.util.List 和 java.io.Serializable 的对象都会在 intent.putExtra(EXTRA_TAG, suchObject)/startActivity(intent)/intent.getSerializableExtra(EXTRA_TAG) 之后变成 ArrayList。

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

于 2013-04-10T10:23:11.047 回答
-2

问题是返回的引用根本不是对LinkedHashMap. 如果函数 Return LinkedHashMap只返回 a LinkedHashMap,则不能将其强制转换为 HashMap。

于 2013-04-10T10:06:40.010 回答