消息中字符串的优雅解决方案

Posted

技术标签:

【中文标题】消息中字符串的优雅解决方案【英文标题】:Elegant solution for String in Message 【发布时间】:2019-04-03 14:34:42 【问题描述】:

我正在编写一个旨在受其他应用程序约束的 android 服务。它使用Messenger 作为IBinder

现在我偶然发现了一个问题:如果我想发送一个 Message 和一个 what 和一个 String,我原本打算使用 Message.obj 来处理它。 正如文档所述,这不起作用:

当使用 Messenger 跨进程发送消息时,如果它包含一个框架类的 Parcelable(不是由应用程序实现的),则它只能是非空的。对于其他数据传输,请使用 setData(Bundle)。

这提出了两个(相关的)问题:

    为什么在 Android 中 String 不是 Parcelable? 有没有比为它创建一个 Bundle 并在那里设置我的 String 更“优雅”的解决方案?

【问题讨论】:

【参考方案1】:

1)因为它兼容Java的String类,它不是Parcelable(因为Java标准库中不存在 2)因为它通常不需要捆绑 - 在大多数情况下,字符串可以通过网络本地发送,而不是可包裹的。你刚刚发现了一个奇怪的角落案例。

不得不说,在 Binder 上使用 Message 有点奇怪。通常,您只需将数据作为单独的参数发送到调用。

【讨论】:

我认为 String 如果在 Android 中扩展到 Parcelable 仍然是兼容的。关于IBinder Messenger 的奇怪之处:如果服务在自己的进程中运行,我不能使用“单个参数”。我只是按照绑定服务的说明进行操作:developer.android.com/guide/components/bound-services#Messenger 如果他们更改了字符串的签名,它将破坏所有非 android java 库。他们不会那样做。而且我已经写了很多活页夹和完整的助手。从未使用过消息 也许我也应该研究一下自定义 AIDL。一个后续问题:自定义aidl 在抛出TransactionTooLargeException 之前是否仍然强制执行1MB 的最大传输限制? 不到一小时,它都使用捆绑包。所以是的,抓住限制仍然存在。解决它们的一种方法是让应用程序为您提供文件的 url,然后您可以读取内容提供者的错误

以上是关于消息中字符串的优雅解决方案的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅的使用RabbitMQ

如何优雅的使用RabbitMQ

优雅的字符串解析解决方案

优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案

安全优雅的RESTful API签名实现方案(手机端)

Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案-备