提问人:Sheraz Ahmad Khilji 提问时间:1/13/2016 更新时间:4/11/2016 访问量:1615
将对象从 Activity 传递到 Fragment 是按引用传递的
Passing Objects from Activity to Fragments is Pass by Reference
问:
当我们使用 和 传递对象时,对象的副本/值被发送到接收方(典型的按值传递行为)。Serializable
Parcelable
activities
activity
但是为什么当我们将对象传递给 as inside 时,出于某种原因,它们会作为对象的引用而不是对象的副本/值发送(通过引用传递行为)。我还没有检查过这个,但我相信它会是一样的。Fragments
Parcelable
Bundle
Serializable
对象以相同的方式传递,那么为什么接收对象和接收对象的方式存在差异呢?Activity
object
Fragment
答:
4赞
CommonsWare
1/13/2016
#1
但是,为什么当我们将对象作为 Bundle 中的 Parcelable 传递给 Fragments 时,出于某种原因,它们会作为对象的引用而不是对象的副本/值发送
这是不能保证的。例如,如果您进行了配置更改,或者您的进程已终止,但用户很快返回到您的任务,您将获得一个副本。
对象的传递方式相同,那么为什么 Activity 接收对象的方式和 Fragment 接收对象的方式不同呢?
启动活动总是涉及 IPC,因此总是涉及跨流程边界复制数据。
评论
0赞
Sheraz Ahmad Khilji
1/13/2016
那么,如何确保当我们将对象传递给片段时,我们总是得到而不是呢?另外,您是否认为在片段的情况下通过引用传递对象是 Android 实现中的错误?copy
reference
0赞
CommonsWare
1/13/2016
@SherazAhmadKhilji:“那么,当我们将对象传递给片段时,我们怎么能确保总是得到副本而不是引用呢?”——不要传递自定义对象。或者,在发布端自己制作副本。或者,在接收方自己制作副本。或者,不要对片段中的对象调用任何 setter。或者,不要以这种方式传递数据,而是使用一些单例数据模型管理器。“另外,你认为在片段的情况下通过引用传递对象是Android实现中的错误吗?”它可以使用更多的文档。Parcelable
0赞
Sheraz Ahmad Khilji
1/14/2016
有点难以理解,人们在Android开发中没有遇到过这个问题。您能否将我链接到一些文章或答案,其中解释了这个问题,并参考了官方 Android 文档
0赞
郭冀龙
4/11/2016
#2
我遇到了同样的问题,我认为它通过了参考。
public void setArguments(Bundle args) {
if (mIndex >= 0) {
throw new IllegalStateException("Fragment already active");
}
mArguments = args;
}
/**
* Return the arguments supplied when the fragment was instantiated,
* if any.
*/
final public Bundle getArguments() {
return mArguments;
}
我从 Fragment 源代码中找到了这一点,它与传递数据的活动不同,尽管它们都使用 .Bundle
评论