将对象从 Activity 传递到 Fragments 是通过引用传递
Posted
技术标签:
【中文标题】将对象从 Activity 传递到 Fragments 是通过引用传递【英文标题】:Passing Objects from Activity to Fragments is Pass by Reference 【发布时间】:2016-04-18 15:09:28 【问题描述】:当我们使用Serializable
和Parcelable
在activities
之间传递对象时,对象的副本/值 被发送到接收方activity
(典型的按值传递行为) .
但是为什么当我们将对象作为Parcelable
在Bundle
中传递给Fragments
时,出于某种原因,它们作为对象的引用 而不是copy/value对象的(按引用传递行为)。我还没有检查过Serializable
,但我相信它会是一样的。
对象以相同的方式传递,那么为什么Activity
接收object
和Fragment
接收它的方式会有所不同?
【问题讨论】:
【参考方案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
。
【讨论】:
以上是关于将对象从 Activity 传递到 Fragments 是通过引用传递的主要内容,如果未能解决你的问题,请参考以下文章
从 android Activity 传递到 Fragment 的 Parcelable 对象
如何将 LocationRequest 对象从活动传递到服务?
如何将数据从 Activity 传递到已创建的 Fragment?
如何使用 TabLayout 将数据从 Activity 传递到 Fragment