gpt4 book ai didi

android - 在包裹中查找 Binder 对象

转载 作者:行者123 更新时间:2023-12-05 00:11:36 28 4
gpt4 key购买 nike

如何在 android parcel 中找到 Binder 对象?我想编码一个有位图的包裹,但我得到运行时异常,说包裹有 Binder 对象。

最佳答案

遗憾的是,你不能。不幸的是,Parcel 有时不仅仅是一个字节流。有时它包含一个智能对象,称为 Binder。这些对象可以使用 IPC 传递,并且具有由 Android 系统不同部分的不同进程调用的方法。

这就是本例中发生的情况。当您调用 Bitmap.writeToParcel() 时,它会将一些智能对象放在那里,需要由操作系统的其他部分查询。这意味着这个 Parcel 根本无法简化为字节流。

(具体来说,我认为发生的事情是这样的——但我可能是错的。我相信这段代码: http://androidxref.com/4.1.1/xref/frameworks/native/libs/binder/Parcel.cpp#736正在将位图数据写入共享内存区域,并将对该共享内存区域的引用放入包裹中。这意味着不需要如此频繁地复制数据,这在您使用 IPC 将 Parcel 传递给另一个进程时非常好,但如果您只是使用它来序列化数据则不太好。)

使用 Parcel.marshall 有时会暗示糟糕的设计......正如评论所说,

The data you retrieve here must not be placed in any kind of persistent storage (on local disk, across a network, etc). For that, you should use standard serialization or another kind of general serialization mechanism. The Parcel marshalled representation is highly optimized for local IPC, and as such does not attempt to maintain compatibility with data created in different versions of the platform.

如果您将它用于本地 IPC,那么您不需要调用 Parcel.marshall - 因为通常它是 AIDL 接口(interface)的一部分,这些事情会自动处理。

抱歉,没有立即解决的办法!如果您将其用于 IPC,则使用 AIDL。如果您将它用于其他用途,则不要使用 Parcel.marshall - 相反,您必须付出更多努力才能将位图字节写入您自己的数据格式。

关于android - 在包裹中查找 Binder 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12510700/

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