如何在android包中找到binder对象?我想编组一个有位图的包裹,但我得到了运行时异常,说包裹有绑定对象。
答案 0 :(得分:6)
Parcel
有时不仅仅是一个字节流。偶尔它包含一个称为Binder的智能对象。这些对象可以使用IPC传递,并且具有由Android系统的不同部分中的不同进程调用的方法。
这就是这种情况下发生的事情。当你打电话给Bitmap.writeToParcel()
时,它会在那里放置一些智能对象,这需要被操作系统的其他部分查询。这意味着这个Parcel根本无法简化为字节流。
(具体来说,我认为发生了什么事 - 但我可能是错的。我相信这段代码: http://androidxref.com/4.1.1/xref/frameworks/native/libs/binder/Parcel.cpp#736 将位图数据写入共享内存区域,并将该共享内存区域的引用放入parcel中。这意味着数据不需要经常复制,这在使用IPC将Parcel传递给另一个进程时非常有用,但如果您只是使用它来序列化数据则不太好。)
使用Parcel.marshall
有时会暗示设计不好......正如评论所说,
您在此处检索的数据不得放在任何类型的持久存储中(在本地磁盘上,通过网络等)。为此,您应该使用标准序列化或其他类型的通用序列化机制。 Parcel编组表示针对本地IPC进行了高度优化,因此不会尝试与在不同版本的平台中创建的数据保持兼容。
如果您将它用于本地IPC,那么您不需要调用Parcel.marshall
- 因为它通常是AIDL接口的一部分,这些接口会自动处理。
抱歉没有立竿见影的解决方案!如果您将其用于IPC,请使用AIDL。如果您将其用于其他内容,则不要使用Parcel.marshall
- 而是您需要付出更多努力将位图字节写入您自己的数据格式。