在我的应用程序中,我花了相当长的时间调试一个可打包的对象。最后,我注意到,幸运的是,通过Bundle发送的对象,在本例中是片段参数,可能与我传递给它的对象完全相同。
考虑下面的代码片段,其中r2不是我所期望的副本,而是相同的对象r;
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中已经存在的东西,在哪种情况下它会通过创建者返回一个副本。
我肯定有,但我找不到正确的搜索关键字。
发布于 2015-05-25 13:13:51
您应该知道,您放入包中的数据是通过引用传递的,而不是对象的副本,因此在同一个类中,这将是同一个对象。在另一端(在您的片段中,在创建它时),对象被反序列化(解组),因此这将生成原始数据的副本。
发布于 2015-05-25 13:17:41
如果您看过 source codes,就会发现这个方法只保存了它的引用(内存中的地址)。
如果要存储该对象的复制/克隆,则应手动复制/克隆该对象,然后将其引用传递给此方法。
发布于 2015-05-25 13:17:42
public void More ...putParcelable(String key, Parcelable value) {
unparcel();
mMap.put(key, value);
mFdsKnown = false;
}
我不知道什么魔术做"unparcel()“方法,但消息来源说,它只是地图的参考价值。
https://stackoverflow.com/questions/30439108
复制相似问题