gpt4 book ai didi

android - 在 Android 上从包中检索数据时出现 ClassCastException

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:05:28 27 4
gpt4 key购买 nike

我想在 fragment 的整个生命周期中保存一些状态。例如,当屏幕旋转时它工作正常,但是当进程被终止并从磁盘恢复时(我认为它是这样工作的),我得到一个 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 是您将返回的默认值。

围绕这个看似错误的解决方案类似于:

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);
}

以上代码未经测试,但应该可以工作。由于接口(interface)的使用,当错误得到修复时,此代码仍然有效。因此,当您的客户端获得 Android 更新时,您可以放心,您的代码应该仍然执行相同的操作,而不是崩溃并提示您无法将 HashMap 转换为 LinkedHashMap。

关于android - 在 Android 上从包中检索数据时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15922572/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com