【问题标题】:Passing Objects from Activity to Fragments is Pass by Reference将对象从 Activity 传递到 Fragments 是通过引用传递
【发布时间】:2016-04-18 15:09:28
【问题描述】:

当我们使用SerializableParcelableactivities 之间传递对象时,对象的副本/值 被发送到接收方activity(典型的按值传递行为) .

但是为什么当我们将对象作为ParcelableBundle 中传递给Fragments 时,出于某种原因,它们作为对象的引用 而不是copy/value对象的(按引用传递行为)。我还没有检查过Serializable,但我相信它会是一样的。

对象以相同的方式传递,那么为什么Activity 接收objectFragment 接收它的方式会有所不同?

【问题讨论】:

    标签: android android-fragments pass-by-reference parcelable pass-by-value


    【解决方案1】:

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

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

    对象的传递方式相同,为什么Activity接收对象的方式和Fragment接收对象的方式有区别?

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

    【讨论】:

    • 那么当我们将对象传递给片段时,如何确保我们总是得到copy 而不是reference?您还认为在片段的情况下通过引用传递对象是Android实现中的错误吗?
    • @SherazAhmadKhilji:“那么当我们将对象传递给片段时,如何确保我们始终获得副本而不是引用?” -- 不要传递自定义的Parcelable 对象。或者,在出版方面自己制作一份副本。或者,在接收方自己制作一份副本。或者,不要在片段中的对象上调用任何设置器。或者,不要以这种方式传递数据,而是使用一些单例数据模型管理器。 “您还认为在片段的情况下通过引用传递对象是Android实现中的错误吗?” - 不。它可以使用更多文档。
    • 在Android开发中人们没有遇到过这个问题,有点难以理解。您能否将我链接到一些文章或答案,其中通过一些官方 Android 文档的参考来解释此问题
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 2013-11-24
      • 1970-01-01
      相关资源
      最近更新 更多