0

我的序列化有问题。

我有一个 HomeHolder 对象,它为我的 HomeFragment 保留一些数据。HomeHolder由1个String、2个String的HashMap的ArrayList和1个包含2个String和2个Drawable的MediaHolder对象组成。

当我旋转设备时,我想恢复 HomeHolder 中包含的数据。所以我尝试在我的 HomeHolder 和我的 MediaHolder 中实现 Serializable 接口。我很确定 Drawable 不是可序列化的,但让我们试试......

我把我的 HomeHolder 作为一个可序列化的对象放在包含我的 HomeFragment 的活动的 saveInstanceState 方法的 Bundle 中(是的,我需要在 HomeFragment 的其他片段中使用这个 HomeHolder,所以我将它保留在我的活动中)并使用 onRestoreInstanceState 恢复它

好吧,现在我将旋转我的 HomeFragment 和惊喜:它工作!(不要问我为什么)。数据不是从网络加载的,而是从我的 HomeHolder 中恢复的。现在我单击启动新活动的 ImageView(例如)。哦,再惊喜:应用程序崩溃......我的 Mediaholder 中的 Drawable 对象似乎变得不可序列化。

所以我的问题是:Drawable Serializable、NotSerializable 还是有时Serializable ?

(我可以给你一些代码,但它没用:它们只是带有 getter/setter 的经典对象和经典的 onSave/onRestore 实现)。

编辑:我在调试器中看到,当我旋转或单击图像视图时,我的 HomeHolder 对象完全相同。没有什么是空的。

4

1 回答 1

0

您不应该其所有者活动的生命周期之后保留 Drawables,请参阅相关的Google 文档

警告:虽然您可以返回任何对象,但绝不应该传递与 Activity 相关联的对象,例如 Drawable、Adapter、View 或与 Context 关联的任何其他对象。如果这样做,它将泄漏原始活动实例的所有视图和资源。(资源泄漏意味着您的应用程序会保留它们并且它们不能被垃圾收集,因此可能会丢失大量内存。)

正确的做法是只保存屏幕状态,并使用屏幕状态重新创建新屏幕,并重新加载其余数据。对于 Web 加载的数据,您可以将它们保存为内存中的原始数据或位图缓存。Bitmap 和 Drawable 之间的最大区别在于 Bitmap 不依赖于任何上下文,因此可以在任何地方使用。

有关提高屏幕旋转速度的方法,请查看此 Google 博客:更快的屏幕方向更改

于 2013-10-28T00:47:40.693 回答