使用改版Message.replyto的Android绑定服务为空

时间:2019-05-21 19:49:43

标签: android retrofit2

我有一个绑定服务,该服务获取一条消息,并设置了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 
                } )
    }

2 个答案:

答案 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);
          })