Drawable Serializable与否或有时?

时间:2013-10-27 23:40:42

标签: android serialization drawable

我的序列化有问题。

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

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

我将HomeHolder作为Serializable对象放在包含我的HomeFragment的活动的saveInstanceState方法的Bundle中(是的,我需要在HomeFragment的其他片段中使用此HomeHolder,因此我将其保留在我的活动中)并使用onRestoreInstanceState恢复它

好吧,现在我将轮换我的HomeFragment并惊喜:它工作了!! (不要问我为什么)。数据不是从Web加载,而是从活动持有的HomeHolder恢复。 现在我点击启动新活动的ImageView(例如)。哦,重新惊喜:应用程序崩溃......我的Mediaholder中的Drawable对象似乎变得不可序列化了。

所以我的问题是:Drawable Serializable,NotSerializable还是SomeSerializable?

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

编辑:我在调试时看到我的HomeHolder对象在旋转或单击imageview时完全相同。没有什么是空的。

1 个答案:

答案 0 :(得分:0)

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

  

警告:虽然你可以返回任何对象,但你永远不应该通过   绑定到Activity的对象,例如Drawable,Adapter,a   查看或与上下文关联的任何其他对象。如果你这样做,   它会泄漏原始活动的所有视图和资源   实例。 (资源泄漏意味着您的应用程序维护一个   抓住他们,他们不能被垃圾收集,所以记忆力很大   可能会丢失。)

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

有关提高屏幕旋转速度的方法,请查看此Google博客:Faster screen orientation change