首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bundle.putParcelable / getParcelable对返回相同的对象实例

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

Stack Overflow用户
提问于 2015-05-25 13:06:21
回答 3查看 1.6K关注 0票数 2

在我的应用程序中,我花了相当长的时间调试一个可打包的对象。最后,我注意到,幸运的是,通过Bundle发送的对象,在本例中是片段参数,可能与我传递给它的对象完全相同。

考虑下面的代码片段,其中r2不是我所期望的副本,而是相同的对象r

代码语言:javascript
运行
复制
Rect r = new Rect();
Log.d("r", r.toString());     // Rect(0, 0 - 0, 0)
Bundle bundle = new Bundle();
bundle.putParcelable("KEY", r);
Rect r2 = bundle.getParcelable("KEY");
r2.set(100, 100, 100, 100);
Log.d("r", r.toString());     // Rect(100, 100 - 100, 100)
Log.d("r2", r2.toString());   // Rect(100, 100 - 100, 100)

现在的问题是,是否有关于这种行为的文献?我在Nexus 5上的Android5.1上遇到了这种行为,我很想知道这是API 1中已经存在的东西,在哪种情况下它会通过创建者返回一个副本。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-25 13:13:51

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

票数 1
EN

Stack Overflow用户

发布于 2015-05-25 13:17:41

如果您看过 source codes,就会发现这个方法只保存了它的引用(内存中的地址)。

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

票数 1
EN

Stack Overflow用户

发布于 2015-05-25 13:17:42

代码语言:javascript
运行
复制
public void More ...putParcelable(String key, Parcelable value) {
     unparcel();
     mMap.put(key, value);
     mFdsKnown = false;
 }

我不知道什么魔术做"unparcel()“方法,但消息来源说,它只是地图的参考价值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30439108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档