gpt4 book ai didi

android - 通过 bundle 检索可打包对象是否总是创建新副本?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:38:43 26 4
gpt4 key购买 nike

我通过在创建 fragment 时添加到包中来将可打包对象传递给 fragment 。在一个实例中,对该分块对象的修改反射(reflect)了原始对象中的修改,而在另一种情况下则不是。我对这种行为感到有些困惑。到现在为止,我一直假设通过一个包检索一个 parceled 对象总是创建新对象[不确定它是浅拷贝还是深拷贝]。

有人请澄清 parcelable 行为。

最佳答案

我遇到了类似的问题。乍一看,我们似乎总是从 parceled 对象中获得一个新的深拷贝。而且,甚至还有some StackOverflow 的回答建议使用 Parcelable 接口(interface)来克隆对象。所有这些只会增加对该主题的混淆。

这是我经过大量搜索和谷歌搜索后发现的:

An unusual feature of Parcel is the ability to read and write active objects. For these objects the actual contents of the object is not written, rather a special token referencing the object is written. When reading the object back from the Parcel, you do not get a new instance of the object, but rather a handle that operates on the exact same object that was originally written.

好的,如您所见,在解包过程中有一些特殊对象没有被复制。但这仍然有点令人困惑。这是否意味着我们有另一个对原始对象的强引用而阻止了它的垃圾回收?这些对象的用例是什么?

  • 为了回答上述问题,我决定查看 Android source code .我正在寻找的方法是 readStrongBinderwriteStrongBinder 根据文档,当发送/接收包裹时,它们不会导致创建新对象。我想我在 ResultReceiver.java 中找到了想要的答案类(class)。这是有趣的一行:

    mReceiver = IResultReceiver.Stub.asInterface(in.readStrongBinder());

    要了解这条线实际上在做什么,我们应该去官方 AIDL documentation .以下是最重要的部分:

The steps a calling class must take to call a remote interface defined with AIDL:
...
5. In your implementation of onServiceConnected(), you will receive an IBinder instance (called service). Call YourInterfaceName.Stub.asInterface((IBinder)service) to cast the returned parameter to YourInterface type.

A few comments on calling an IPC service:

Objects are reference counted across processes.

所以让我们把所有的东西放在一起:

  1. 可以在不涉及深度复制过程的情况下提取分块对象。
  2. 如果使用 readStrongBinder 方法读取分块对象,则不会创建新实例。我们只是获得了对原始对象的新引用,该引用可以防止其重新分配。
  3. 要知道我们的对象在收到包裹后是否会被深拷贝,我们应该仔细看看具体的 Parcelable 接口(interface)实现。
  4. Android 文档可能真的很困惑,要正确理解它可能需要很多时间。

希望这些信息对您有所帮助。

如果您想阅读有关 Parcelable 对象的混淆会导致严重问题的真实示例,请查看我的 blog post .

关于android - 通过 bundle 检索可打包对象是否总是创建新副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39916021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com