Bundle.putParcelable / getParcelable对返回相同的对象实例

时间:2015-05-25 13:06:22

标签: android

我花了很长时间调试一个在我的应用程序中表现得很奇怪的parcelable对象。最后我注意到,幸运的是,通过Bundle发送的对象(在本例中为Fragment参数)可能与我传递给它的对象完全相同。

请考虑以下代码段,其中 r2 不是副本,正如我预期的那样,但相反的对象 r ;

nested

现在问题是在某处有关于此行为的文档吗?我在Nexus 5上的Android 5.1上遇到了这种行为,并且有兴趣知道这已经存在于API 1中,例如在某些情况下它会通过创建者返回副本。

我确定有,但我找不到正确的搜索关键字。

3 个答案:

答案 0 :(得分:1)

您应该知道放入包中的数据是通过引用传递的,而不是对象的副本,因此在同一个类中,这将是同一个对象。在另一端(在你的片段中,在创建它时)很难,该对象被反序列化(解组),因此这会复制原始数据。

答案 1 :(得分:1)

如果您查看putParcelable source codes,您会注意到此方法仅保存其引用(地址在内存中)。

如果要存储该对象的副本/克隆,则应手动复制/克隆该对象,然后将其引用传递给此方法。

答案 2 :(得分:1)

public void More ...putParcelable(String key, Parcelable value) {
     unparcel();
     mMap.put(key, value);
     mFdsKnown = false;
 }

我不知道“unparcel()”方法有什么魔力,但消息人士说这只是带参考值的Map。