将对象从 Activity 传递到 Fragment 是按引用传递的

Passing Objects from Activity to Fragments is Pass by Reference

提问人:Sheraz Ahmad Khilji 提问时间:1/13/2016 更新时间:4/11/2016 访问量:1615

问:

当我们使用 和 传递对象时,对象的副本/值被发送到接收方(典型的按值传递行为)。SerializableParcelableactivitiesactivity

但是为什么当我们将对象传递给 as inside 时,出于某种原因,它们会作为对象的引用而不是对象的副本/值发送(通过引用传递行为)。我还没有检查过这个,但我相信它会是一样的。FragmentsParcelableBundleSerializable

对象以相同的方式传递,那么为什么接收对象和接收对象的方式存在差异呢?ActivityobjectFragment

Android-Fragments 按引用传递 可分包 的 Pass-By-Value

评论


答:

4赞 CommonsWare 1/13/2016 #1

但是,为什么当我们将对象作为 Bundle 中的 Parcelable 传递给 Fragments 时,出于某种原因,它们会作为对象的引用而不是对象的副本/值发送

这是不能保证的。例如,如果您进行了配置更改,或者您的进程已终止,但用户很快返回到您的任务,您将获得一个副本。

对象的传递方式相同,那么为什么 Activity 接收对象的方式和 Fragment 接收对象的方式不同呢?

启动活动总是涉及 IPC,因此总是涉及跨流程边界复制数据。

评论

0赞 Sheraz Ahmad Khilji 1/13/2016
那么,如何确保当我们将对象传递给片段时,我们总是得到而不是呢?另外,您是否认为在片段的情况下通过引用传递对象是 Android 实现中的错误?copyreference
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