是否可以保存对捆绑中对象的引用?
不是整个对象,只是参考?
例如,Bundle
类具有get
对象的方法,但我无法找到put
或set
方法。
我需要它,因为在一个活动中,我创建了一个我的计时器类的实例,然后我启动了计时器:myTimer.start()
如果我必须重新启动活动,我想将计时器恢复为之前的值。
答案 0 :(得分:5)
希望你不能这样做。您只能在包中存储基元。正如Marcin Orlowski提到的“存储”,整个对象可以通过实现Parcelable接口来实现。通过“存储”我的意思是存储对象状态。实现此接口可帮助您将对象状态保存在不同的代码段中,而不会一遍又一遍地将所有属性都放到Bundle
对象中。
当活动迟早进入暂停状态时,您的活动使用的所有对象都将被垃圾收集器删除,因此存储对它们的引用将是愚蠢的。
答案 1 :(得分:2)
你做不到。您只能传递有限的数据类型集,如looking at method lists in the docs所示,如果您需要的不仅仅是单个基元,那么您的类需要实现Parcelable接口(或使用类似Parceler的帮助器) 。完成后,您将能够通过Bundle传递对象数据(但仍然不是对象本身)
答案 2 :(得分:2)
官方文档建议在“配置更改”期间使用片段存储引用(不,我认为这并不意味着您需要将您的活动作为片段放置,而是使用片段作为存储介质(需要说明) ):
http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject
在配置更改期间保留对象
如果重新启动活动需要恢复大量数据,请重新建立 网络连接,或执行其他密集操作,然后一个完整的 由于配置更改而重新启动可能会导致用户体验变慢。 此外,您可能无法完全恢复您的 具有Bundle的活动状态,系统为您保存 onSaveInstanceState()回调 - 它不是为了携带大而设计的 对象(如位图)及其中的数据必须序列化 然后反序列化,这可以消耗大量的内存并使其成为 配置变化缓慢。在这种情况下,你可以缓解 通过在何时保留片段来重新初始化您的活动的负担 由于配置更改,您的活动将重新启动。这个 片段可以包含对您想要的有状态对象的引用 保留
当Android系统因为a而关闭您的活动时 配置更改,您拥有的活动片段 标记为保留不被销毁。您可以将此类片段添加到您的 用于保存有状态对象的活动。
在运行时期间保留片段中的有状态对象 配置更改:
扩展Fragment类并声明对有状态的引用 对象。创建片段时调用setRetainInstance(boolean)。 将片段添加到您的活动中。使用FragmentManager检索 活动重新启动时的片段。例如,定义您的 片段如下:
public class RetainedFragment extends Fragment {
// data object we want to retain
private MyDataObject data;
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
public void setData(MyDataObject data) {
this.data = data;
}
public MyDataObject getData() {
return data;
}
}
警告:虽然您可以存储任何对象,但您永远不应该传递 绑定到Activity的对象,例如Drawable,Adapter,a 查看或与上下文关联的任何其他对象。如果你这样做, 它会泄漏原始活动的所有视图和资源 实例。 (资源泄漏意味着您的应用程序维护一个 抓住他们,他们不能被垃圾收集,所以记忆力很大 可能会丢失。)
答案 3 :(得分:1)
另一种方法是将POJO转换为json,然后将GSON库串起来并以字符串形式保存在bundle中。然后从bundle中将其作为字符串检索回来,并使用相同的GSON库将其转换回对象。下面的示例代码。
将JSON转换为String并将其保存在包
中JsonElement json = new JsonElement();
String result = gson.toJson(json);
bunlde.putString("key",result);
再次将String从bundle转换为object
JsonElement json = gson.fromJson(bundle.getString("key"), JsonElement.class);