首页 > 解决方案 > 使用改造 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 
                } )
    }

标签: androidretrofit2

解决方案


我有同样的问题。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);
          })

推荐阅读