通过捆绑检索可分割对象是否总是创建新副本?

2024-04-28

我通过在创建片段时添加到捆绑包中来将可打包对象传递给片段。在一个实例中,对此包裹对象的修改反映了原始对象的修改,而在另一种情况下则不然。我对这种行为有点困惑。 到目前为止,我假设通过捆绑检索打包对象总是会创建新对象[不确定它是浅复制还是深复制]。

请有人澄清可分割的行为。


我正在为类似的问题而苦苦挣扎。乍一看,我们似乎总是从包裹的对象中获取新的深层副本。不仅如此,甚至还有some https://stackoverflow.com/questions/3773200/using-parcel-to-clone-an-object建议使用的 StackOverflow 答案Parcelable克隆对象的接口。所有这些只会增加有关该主题的混乱。

以下是我经过大量搜索和谷歌搜索后发现的内容:

  • 仔细看看官方Parcel 文档 https://developer.android.com/reference/android/os/Parcel.html。这是重要的引用:

Parcel 的一个不寻常的特性是能够读写活动 对象。对于这些对象,对象的实际内容不是 写入,而不是写入引用该对象的特殊标记。 当从 Parcel 读回对象时,您没有得到新的 实例对象的,而是对对象进行操作的句柄 与最初编写的对象完全相同。

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

  • 为了回答上述问题,我决定研究一下 Android源代码 https://android.googlesource.com/platform/frameworks/base/+/android-3.2.4_r1/core/java/android/os。我正在寻找的方法是readStrongBinder and writeStrongBinder根据文档,在发送/接收包裹时不会导致创建新的对象。我想我在其中找到了想要的答案结果接收器.java https://android.googlesource.com/platform/frameworks/base/+/android-3.2.4_r1/core/java/android/os/ResultReceiver.java班级。这是有趣的一行:

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

    要了解这条线实际上在做什么,我们应该去官方AIDL文档 https://developer.android.com/guide/components/aidl.html。以下是最重要的部分:

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

关于调用IPC服务的几点评论:

对象是引用计数跨流程。

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

  1. 可以提取包裹的对象,而无需涉及深复制过程。
  2. 如果使用读取包裹对象readStrongBinder方法没有创建新实例。我们只是获取对原始对象的新引用,并且该引用可以防止其释放。
  3. 要知道您的对象在收到包裹后是否会被深度复制,我们应该仔细看看具体的情况Parcelable接口实现。
  4. Android 文档可能真的很混乱,可能需要很多时间才能正确理解它。

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

如果您想了解一个现实世界的例子,当您遇到以下困惑时Parcelable物体可能会导致严重的问题,看看我的博客文章 https://stanmots.blogspot.com/2016/10/androids-bad-company-intentservice.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过捆绑检索可分割对象是否总是创建新副本? 的相关文章

  • 用于 Kotlin 中单元测试的 BuildConfigField 模拟

    我正在尝试尽可能多地涵盖Kotlin Android 库我遇到了有关自定义 BuildConfig 变量的问题 更广为人知的是buildConfigField 我想模拟这个变量来测试两者true and false values 从 Gra
  • 通过代码在创建时突出显示 ListView 项目

    我想在创建 listView 时突出显示 ListView 的第一行 0 我尝试了不同的方法 就像您在注释代码中看到的那样 但没有任何效果 这很奇怪 因为 OnItemClickListener 中的突出显示工作正常 它通过 xml 选择器
  • 在工具栏下显示内容

    您好 我试图简单地将我的内容放在工具栏下方 但是当我运行我的应用程序时 某些内容本应位于工具栏下方 却隐藏在工具栏后面 我已经阅读了有关使用框架布局来尝试将其分离的内容 但我有点卡住了 我目前正在使用该软件提供的基本 android stu
  • 升级到最新支持库后Android JACK编译器错误

    Android Studio 2 2 3 Windows 10 64位 构建工具版本 25 Android Gradle插件版本2 2 3 升级到最新的支持库 从 23 4 0 到 25 1 0 并更改编译版本 从 23 到 25 后 我收
  • Android ToggleButton 始终检查

    如果切换按钮处于选中或取消选中状态 我想存储在 SharedPreferences 中 toggle setOnCheckedChangeListener new OnCheckedChangeListener public void on
  • Android 中使用黑白 alpha 蒙版的高效位图蒙版

    我想用黑白 alpha 蒙版来掩盖位图 我的蒙版图像是黑白的 黑色区域意味着透明 白色区域意味着不透明 我需要的是 当我使用此蒙版图像来蒙版任何其他图像时 如果蒙版图像的相应区域为黑色 则生成的图像区域应为透明 否则 生成的图像区域应该是不
  • VOIP通话录音

    我正在开发一个在 android 中录制 VOIP 通话的项目 我没有找到任何解决方案 有很多应用程序支持手机上的 VOIP 录音 我找不到任何教程和帮助 立方体通话记录器 https play google com store apps
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • 如何清除Android剪贴板?

    我发现的方法都不起作用 这是我尝试过的 1 使用clearPrimaryClip 的方法ClipboardManager class ClipboardManager clipboard ClipboardManager getSystem
  • Toast 消息消失后​​完成活动吗?

    有谁知道 是否有可能对 Toast 消息执行某些操作 在我的情况下完成活动 将被关闭 您只需创建一个Thread持续时间只要Toast显示 然后您就可以完成您的Activity public void onCreate Bundle sav
  • FragmentActivity 无法解析为类型

    我正在尝试来自的应用程序这个博客 http android developers blogspot com 2011 02 android 30 fragments api html 在延长的同时FragmentActivity 我收到以下
  • 模拟器无法加载

    我正在使用 hello android 教程并通过 eclipse 创建 avd 启动模拟器时不使用图像 它只是显示一个黑色的后屏 中间有 ANDROID 字样 并且在 ANDROID 字样的末尾有一个闪烁的光标 我已按照 T 的步骤安装
  • AndEngine MenuScene - 无法单击按钮

    我有一个关于 android 和 andengine 的小问题 这是我的主菜单的源代码 AbstractScene is extending Scene public class MainMenuScene extends Abstract
  • Android Google Map V2:如何在单击另一个标记时更改先前单击的标记的图标

    更新 我通过添加 previousMarker 对象解决了性能问题 因此 只有先前单击的标记将被删除并替换为默认图标 但是 当我单击标记时 信息窗口仍然不显示 我有一个地图视图并在上面设置了一些标记 我想要的是 当我单击一个标记时 它将其图
  • 活动加载缓慢

    我的应用程序中有大约 50 个活动 但其中一个活动非常慢 我的意思是当我按下按钮进入该活动时 需要很长时间 有时会出现黑屏 在该活动中 我有一个按钮 如果我单击该按钮 则需要很长时间才能执行 代码很轻 只有一个Button EditText
  • Expresso 的 Android 测试首选项片段

    我在通过 Expresso 测试我的代码时遇到问题 我写了这段代码 public class SettingsActivity extends Activity Override protected void onCreate Bundle
  • Android 中 Activity 之间的 3D 动画

    How to create animation between two Activity look like As Screen shot in android 搜索jazzyviewpager 这是link https github co
  • 通过 Gradle 和 Android Studio 构建和运行应用程序比通过 Eclipse 慢

    我有一个多项目 10 个模块 每次构建大约需要 20 30 秒 当我在 Android Studio 中按 运行 时 每次都必须等待才能重建应用程序 这非常慢 是否可以在 Android Studio 中自动化构建过程 或者您对如何加快此过
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • 调试android数据绑定?

    谁能告诉我如何调试或找到数据绑定生成的代码 从this https www youtube com watch v NBbeQMOcnZ0链接我发现它生成了所需的代码 我猜您正在寻找自动生成的绑定 java 文件 我也在寻找他们 最后我在这

随机推荐

  • 当我调用 CMake 时如何定义变量,以便 qtcreator 知道它已定义?

    我有一段根据 define 有条件激活的代码 如下所示 ifdef VARIABLE code function endif cmake 脚本有一个 选项 命令 可以像这样设置变量 option VARIABLE Want to use V
  • 使用 java.nio.Files 更改 Linux 下的文件所有者组

    我有一台 Linux 服务器 并且正在 Java 中为服务器上的多个网站运行图像调整大小作业 网站文件由不同的操作系统用户 组拥有 新创建的缩略图 预览由运行调整大小作业的用户拥有 现在我正在谷歌搜索如何在调整大小程序中更改新创建的预览 缩
  • 使用安全字符串并保持其安全[重复]

    这个问题在这里已经有答案了 所以 NET框架提供了安全字符串 http msdn microsoft com en us library system security securestring aspx用于以安全方式存储字符串的类 但要读
  • 如何提高非持久 CGI 进程中的 Moose 性能?

    Moose http search cpan org dist Moose 是一个很棒的对象框架 问题在于 连同它的依赖项一起 它是very大的 我们的分析表明 在我们的平台上 仅加载 Moose 就会在非持久性 CGI 应用程序脚本上产生
  • 如何从位图中删除白色背景色

    我想删除位图中的白色背景颜色 Bitmap capcha new Bitmap C image jpg pictureBox1 Image capcha 但我想在我的 pictureBox1 中仅显示背景中存在的没有白色的图像 尝试在验证码
  • UITableViewDiffableDataSource 可以检测到项目已更改吗?

    在下面与 AndreasOetjen讨论后重写了这个问题 感谢他的评论 我在使用时遇到了问题UITableView具有不同的数据源 在我的应用程序中 当用户修改某个项目时 它可能会更改同一表视图中显示的另一个项目 问题是 在我创建并应用包含
  • 复选框和标签之间的填充

    对于 CSS 专家来说 此标记输出一个带有标签的复选框Value1在它的右边 但是Value1距离复选框太近 dd dd
  • 如何广播对 Android 应用程序安装的推荐

    没有回答 几乎同样的问题 https stackoverflow com questions 18571920 how to get referrer url for apps downloaded from outside the mar
  • 使用 php 执行 *.sql 文件

    我需要执行一个 sql 文件 其中大约有 48 个要创建的表 它由注释和以 结尾的sql命令组成 有没有办法运行这些 sql 命令 将它们立即转换为单个字符串 我的意思是我需要使用 php 立即运行整个文件 我可以使用 mysql quer
  • 为什么 C# 静态构造函数需要括号?

    考虑 class Foo static Foo Static initialisation 为什么是 需要在static Foo 静态构造函数必须始终是无参数的 那为什么还要麻烦呢 它们是否有必要避免一些解析器的歧义 或者只是为了保持与常规
  • 文件下载时文件名损坏 (IE)

    我实现了一个简单的文件上传下载机制 当用户单击文件名时 将下载带有以下 HTTP 标头的文件 HTTP 1 1 200 OK Date Tue 30 Sep 2008 14 00 39 GMT Server Microsoft IIS 6
  • 使用 jQuery 在图像上“绘制”简单线条并保存到 Rails DB 的最简单方法是什么?

    我想在图像上画线 基本上允许用户为他们喜欢的山路绘制一条路径 1 有谁知道一个好的简单的绘制基本线条的库吗 2 用户在图像上绘制一堆线条后 将数据保存到数据库的最佳方式是什么 画线 Paper js http paperjs org 看着那
  • 如何使用 ORACLE SQL 从 XML 中单独提取可重复的 json 节点值?

    我有以下 XML 我想提取 json 参数 serviceNumber 的值分别地我尝试使用 EXTRACT 函数 但我得到了连接的结果 但我希望将它们分开
  • Apache Spark Parquet:无法构建空组

    我使用 Apache Spark 2 1 1 使用过 2 1 0 它是相同的 今天切换 我有一个数据集 root muons array nullable true element struct containsNull true reco
  • 编写我们自己的 Dispose 方法而不是使用 Idisposable

    在浏览了很多相关文章后IDisposable 我对它的用法感到困惑 所有文章都解释了它是什么以及如何实现它 但我想了解如果没有它我们会错过什么 这是一个类实现的示例IDisposable 通常 dispose 的使用被显示为处置一个数据库连
  • 如何确定实际物理网卡的 MAC 地址——而不是 VPN 创建的虚拟网络接口 (.NET C#)

    背景 我正在尝试从计算机中获取唯一标识符 并且希望每次都能可靠地返回相同的 MAC 地址 相信我 我有使用 MAC 地址的理由 并且阅读了许多关于替代唯一 id 方法的帖子 是的 我考虑过他们是否没有任何网卡 Problem 问题出在 NE
  • 阻止 gulp 更改 shell/cmd 标题名称

    当 gulp 被调用时 它会将我的 cmd windows 标题更改为 gulp 我希望窗口名称保持原样 我知道我可以使用https www npmjs com package gulp shell https www npmjs com
  • Dropwizard 文件上传

    我必须从我的网站上传一个文件 但 cnt 似乎可以使其与放置向导一起使用 这是我网站上的表格
  • Google 应用引擎 - 限制上传文件大小

    我想根据以下要求限制文件上传期间的大小 1 客户端 除非使用Flash或Applet等客户端插件 否则这几乎是不可能的 所以我放弃了这个 2 在服务器端 我可以在将文件 图像 视频存储到数据库之前知道其大小吗 Thanks 随着斑点存储区
  • 通过捆绑检索可分割对象是否总是创建新副本?

    我通过在创建片段时添加到捆绑包中来将可打包对象传递给片段 在一个实例中 对此包裹对象的修改反映了原始对象的修改 而在另一种情况下则不然 我对这种行为有点困惑 到目前为止 我假设通过捆绑检索打包对象总是会创建新对象 不确定它是浅复制还是深复制