我有一个绑定服务,该服务获取一条消息,并设置了replyTo值。在订阅(在我的情况下为错误块)上调用REST服务之后,replyTo为null。我检查以确保返回相同的线程(主线程)。不知道为什么会这样。这是一段代码...
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
} )
}
答案 0 :(得分:0)
对于其他任何人,也会遇到同样的问题。我可以通过创建一个新的HandlerThread并在绑定服务中创建Handler类时使用它来解决此问题。然后,这会在非UI线程上处理所有消息,并允许我删除RxJava subscriptionOn和observeOn。
答案 1 :(得分:0)
我有同样的问题。返回handleMessage之后的消息对象将被其他程序回收和使用。订阅中的RX rest调用和代码是在新线程中异步执行的,因此可以并且很可能在回收消息对象并将其用于其他目的时在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);
})