android - 使用改造 Message.replyto 的 Android 绑定服务为空
问题描述
我有一个绑定服务,它会收到一条带有 replyTo 值集的消息。在通过订阅(或在我的情况下为错误块)调用其余服务后,replyTo 为空。我检查以确保我返回到同一个线程(主线程)。不知道为什么会这样。这是一段代码...
private fun handleMessage(message: Message) {
//message.replyTo is valid here
disposable = serviceHandler
.getSpaces()
.retry(Constants.REST_RETRY)
.subscribeOn(Schedulers.newThread()) //new thread for call REST
.observeOn(AndroidSchedulers.from(this.looper)) //validated thread ID is the same as when the function started
.subscribe(
{
//DO SOMETHING
},
{ error ->
//message.replyTo is null
},
{
//complete
} )
}
解决方案
我有同样的问题。handleMessage 返回后的消息对象被其他程序回收使用。RX rest 调用和 subscribe 中的代码在新线程中异步执行,因此它可以,并且可能会在消息对象被回收并用于其他目的时返回 handleMessage 后执行。
所以代码:
private fun handleMessage(message: Message) {
Log.i("TAG", "start of handleMessage");
disposable = serviceHandler
.getSpaces()
.retry(Constants.REST_RETRY)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.from(this.looper))
.subscribe(
{
Log.i("TAG", "end of rest call - now using message");
},
{ error ->
//message.replyTo is null
},
{
//complete
} )
Log.i("TAG", "end of handleMessage - message is now free");
}
会表现:
start of handleMessage
end of handleMessage - message is now free <- here message is returned to pool
end of rest call - now using message
要在订阅中使用消息,请对其进行复制并使用该副本:
Message messageCopy = Message.obtain(message);
...
.subscribe({
Log.i("TAG", "copied message" + messageCopy.what);
})
推荐阅读
- auto-lock - 在 MS 访问中输入数据后如何自动锁定字段
- python - 使用 python 从控制台获取特定值
- flutter - 在 Flutter 应用程序上将 .svg 转换为 .ttf
- flutter - 颤动:我想要中心的文字
- mongodb - 在聚合期间计算 mongo 记录中的出现次数
- android - 如何在颤动的android tv应用程序中专注于listview项目
- java-8 - 使用 Java 时间将日期时间字符串解析为 Predicate 中的日期
- gradle - 升级后 Gradle 构建速度要慢得多
- reactjs - 如何将选择的任何值添加到数组中?
- python - 如何删除字符串末尾的逗号