【问题标题】:Android Wear PendingResult onResult callback not being calledAndroid Wear PendingResult onResult 回调未被调用
【发布时间】:2023-03-12 21:12:02
【问题描述】:

在 sendMessage 之后,我得到一个 PendingResult 并设置一个 onResult 回调。这个回调永远不会发生。

PendingResult<MessageApi.SendMessageResult> messageResult = Wearable.MessageApi
            .sendMessage(googleApiClient, senderNodeId, NOTE_REPLY_PATH,
                         replyMessage.getBytes());

    if (messageResult.isCanceled())
        Log.d(TAG, "result cancelled!");

    messageResult.setResultCallback(new ResultCallback<MessageApi.SendMessageResult>()
    {
        @Override
        public void onResult(MessageApi.SendMessageResult sendMessageResult)
        {
            replyStatus = sendMessageResult.getStatus();

            runOnUiThread(new Runnable()
            {
                @Override
                public void run()
                {
                    Log.d(TAG, "confirm result");
                    confirm(replyStatus.getStatusCode() == WearableStatusCodes.SUCCESS);
                }
            });
        }

isCancelled 并非如此。我尝试了 awat() 但这不能在 UI 线程(这是)上调用。令人不安的是,您必须在调用 sendMessage 之后设置回调(如果那时它已经发送了怎么办)。但这是文档想要的方式。

基本上我的“确认结果”永远不会发生。

任何想法为什么?谢谢

编辑:

结果有时我没有连接到任何节点。这可能就是为什么。那么如果它不能调用回调,这个接口是如何传达的。这个sendmessage界面设计很差。相反,它应该类似于

status = sendMessage(callback, other args);

因为它无法告诉你回调不可能发生。

【问题讨论】:

    标签: android wear-os


    【解决方案1】:

    您需要连接才能获得回调。由于这些调用的异步特性,您应该始终注册回调,以通知您连接状态是否已更改(甚至更多,如果您的目标节点断开连接等,则通知您)。

    在调用本身之后设置回调的模式不是问题;框架确保如果您的调用到达可穿戴代码,则调用您之后注册的 PendingResult 回调。

    这里要说得很清楚,即使你收到一个状态为成功的回调,也不代表你的消息(使用MessageApi)已经成功传递到目标节点; “成功”仅表示您的消息已排队(仅当您的设备连接到目标节点时才会发生)并且由于网络条件(例如,您的消息已排队并且您得到一个成功结果,但在交付之前,连接中断)。相反,DataApi 保证最终同步,即使在使用 DataApi 添加项目时没有与其他节点的连接;重新建立连接后,就会发生同步。

    【讨论】:

    • 感谢您的回答。你是说我应该监控 Node api 并且知道如果我已经断开连接就不要尝试发送。那将解决它。但是,在这种情况下 sendMessage 不能返回错误代码而不是什么都不做,这仍然很烦人。我确实收到了丢失的消息,所以我必须实现消息回复 ACK/NAK 以真的找出消息是否已送达。您是在建议我应该使用 dataapi 吗?那有开销吗。我真的没有数据来同步只有一条消息要发送,我需要确保它已经收到,从那里收到 ACK。
    • 不,如果 DataApi 不适合您的用例,我不建议使用它;我提到它是为了强调 MessageApi 的合同是基于尽力而为的尝试,而 DataApi 有一个强有力的交付合同。在使用任何使用 ApiClient 作为参数和程序的 API 之前,您需要知道您是否已连接,以便与其他节点的连接可以随时消失;如果发送和接收消息很重要,请按照您的做法使用 ACK 确认。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多