Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过包检索可包裹对象是否总是创建新副本?_Android_Android Fragments_Parcelable_Android Bundle - Fatal编程技术网

Android 通过包检索可包裹对象是否总是创建新副本?

Android 通过包检索可包裹对象是否总是创建新副本?,android,android-fragments,parcelable,android-bundle,Android,Android Fragments,Parcelable,Android Bundle,在创建片段时,我将一个可包裹的对象添加到一个束中,从而将其传递给片段。在onc实例中,对该地块对象的修改反映了对原始对象的修改,而在另一种情况下则不是。我对这种行为有点困惑。 到目前为止,我一直假设通过一个包检索一个包裹的对象总是会创建一个新对象[不确定它是浅拷贝还是深拷贝] 请有人澄清包裹的行为 我也遇到了类似的问题。乍一看,我们似乎总是从包裹的对象中获得新的深度副本。此外,甚至有StackOverflow答案建议使用Parcelable接口克隆对象。所有这些只会增加关于这个问题的困惑 经过大

在创建片段时,我将一个可包裹的对象添加到一个束中,从而将其传递给片段。在onc实例中,对该地块对象的修改反映了对原始对象的修改,而在另一种情况下则不是。我对这种行为有点困惑。 到目前为止,我一直假设通过一个包检索一个包裹的对象总是会创建一个新对象[不确定它是浅拷贝还是深拷贝]


请有人澄清包裹的行为

我也遇到了类似的问题。乍一看,我们似乎总是从包裹的对象中获得新的深度副本。此外,甚至有StackOverflow答案建议使用
Parcelable
接口克隆对象。所有这些只会增加关于这个问题的困惑

经过大量搜索和谷歌搜索,我发现:

  • 仔细查看官方的
    包裹
    。以下是一段重要的引语:
Parcel的一个不寻常的功能是读写活动数据的能力 物体。对于这些对象,对象的实际内容不是 写入,而不是写入引用对象的特殊标记。 从地块读回对象时,不会得到新的 对象的实例,而是在 与最初编写的完全相同的对象

好的,正如您所看到的,有一些特殊的对象在解包期间没有被复制。但这仍然有点令人困惑。这是否意味着我们有另一个对原始对象的强引用来阻止其垃圾收集?这些对象的用例是什么

  • 为了回答上面提到的问题,我决定浏览一下Android。我正在寻找的方法是
    readStrongBinder
    writeStrongBinder
    ,根据文档,这些方法在发送/接收包裹时不会导致创建新对象。我想我在课堂上找到了想要的答案。下面是有趣的一句话:

    mReceiver = IResultReceiver.Stub.asInterface(in.readStrongBinder());
    
    要了解这条线实际上在做什么,我们应该去官方那里。以下是最重要的部分:

调用类调用定义的远程接口必须采取的步骤 使用AIDL:
...
5.在onServiceConnected()的实现中,您将收到 IBinder实例(称为服务)。呼叫 YourInterfaceName.Stub.aInterface((IBinder)服务)来转换 已将参数返回到接口类型

关于调用IPC服务的一些评论:

对象跨进程进行引用计数

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

  • 可以在不涉及深度复制过程的情况下提取包裹的对象
  • 如果使用
    readStrongBinder
    方法读取包裹对象,则不会创建新实例。我们只需要获得一个对原始对象的新引用,这个引用可以防止其取消分配
  • 要知道我们的对象在收到包裹后是否会被深度复制,我们应该仔细查看具体的
    Parcelable
    接口实现
  • Android文档可能会非常混乱,并且可能需要很多时间才能正确理解它 希望这些信息能对你有所帮助


    如果你想了解一个真实的例子,当关于
    Parcelable
    对象的混淆可能导致严重问题时,请查看我的。

    这是我目前为止的测试。如果我们通过Intent+Parcelable将一个对象传递给Activity,它将按值传递。如果我们通过Parcelable将一个对象传递给Fragment,它将通过引用传递。但是,我认为这种行为不能保证,因为没有记录在案。