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

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(使用前将#替换为@)

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

  • 找不到参数的方法 dependencyResolutionManagement()

    我正在尝试使用老师给我的一个项目 但它显示了一个错误 Settings file Users admin AndroidStudioProjects HTTPNetworking settings gradle line 1 A probl
  • 使用workmanager时Firestore脱机持久性错误

    我正在使用一个WorkManger定期从我的中检索信息Firestore当应用程序处于后台和前台时的数据库 此信息用于根据状态更新 UI 因此不同的状态会添加或删除 UI 的不同部分 第一次运行时效果很好 但是 一旦应用程序处于后台并且Wo
  • 类型容器“Android 依赖项”引用不存在的库 android-support-v7-appcompat/bin/android-support-v7-appcompat.jar

    我在尝试在我的项目中使用 Action Bar Compat 支持库时遇到了某种错误 我不知道出了什么问题 因为我已按照此链接中的说明进行操作 gt http developer android com tools support libr
  • 如何重试已消耗的 Observable?

    我正在尝试重新执行失败的已定义可观察对象 一起使用 Retrofit2 和 RxJava2 我想在单击按钮时重试特定请求及其订阅和行为 那可能吗 service excecuteLoginService url tokenModel Ret
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • 如何在android中获取Camera2 API的当前曝光

    In android hardware Camera旧的 我使用下面的代码获取当前曝光并获取它Camera Camera Parameters param mCamera getParameters currentExposure para
  • 是否可以将数组或对象添加到 Android 上的 SharedPreferences

    我有一个ArrayList具有名称和图标指针的对象 我想将其保存在SharedPreferences 我能怎么做 注意 我不想使用数据库 无论 API 级别如何 请检查SharedPreferences 中的字符串数组和对象数组 http
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • 是否必须删除 Intent extra?

    这可能是一个愚蠢的问题 但是是否有一条规则规定消费活动必须显式删除 Intent 额外内容 或者只有在回收 Intent 对象时才如此 换句话说 如果我总是通过执行以下操作来链接到下一个活动 Intent i new Intent MyCu
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 是否有 ADB 命令来检查媒体是否正在播放

    我想使用 ADB 命令检查根植于终端的外部设备中是否正在播放音频 视频 我无法找到任何 ADB 命令 如果有 我尝试过 adb shell dumpsys media player 我想要一个命令来指定视频是否正在运行 您可以使用以下命令查
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符

    更新 4 我已经成功运行了firstchar例如 但现在的问题是使用regex 即使包含头文件 它也无法识别regex操作员 有什么线索可以解决这个问题吗 更新 2 我已经编译了sqlite3我的项目中的库 我现在正在寻找任何人帮助我为我的
  • 如何发布Android .aar源以使Android Studio自动找到它们?

    我正在将库发布到内部 Sonatype Nexus 存储库 Android Studio 有一个功能 可以自动查找通过 gradle 引用的库的正确源 我将 aar 的源代码作为单独的 jar 发布到 Nexus 但 Android Stu
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • Android Studio - Windows 7 上的 Android SDK 问题

    我对 Google i o 2013 上发布的最新开发工具 Android Studio 有疑问 我已经成功安装了该程序并且能够正常启动 我可以导入现有项目并对其进行编辑 但是 当我尝试单击 SDK 管理器图标或 AVD 管理器图标时 或者

随机推荐

  • 当我调用 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 随着斑点存储区
  • 通过捆绑检索可分割对象是否总是创建新副本?

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