【问题标题】:PendingResult.setResultCallback() always returns the statusCode successPendingResult.setResultCallback() 总是返回 statusCode 成功
【发布时间】:2016-04-25 10:05:09
【问题描述】:

如果我成功地将我的 google watch 与移动设备连接,然后禁用蓝牙连接(出于测试原因)并对我的移动设备进行 google api 客户端调用,挂起的结果总是返回状态码成功,即使它不成功,因为没有更多的连接

请求的异步任务

class DataTask  extends AsyncTask<Node, Void, Void> {

    @Override
    protected Void doInBackground(Node... nodes) {
        Gson gson = new Gson();
        Request requestObject = new Request();
        requestObject.setType(Constants.REQUEST_TYPE);
        String jsonString = gson.toJson(requestObject);

        PutDataMapRequest dataMap = PutDataMapRequest.create(Constants.PATH_REQUEST);
        dataMap.setUrgent();
        dataMap.getDataMap().putString(Constants.KEY_REQUEST, jsonString);
        PutDataRequest request = dataMap.asPutDataRequest();
        DataApi.DataItemResult dataItemResult = Wearable.DataApi
                .putDataItem(googleApiClient, request).await();

        boolean connected = googleApiClient.isConnected();
        PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi.putDataItem(googleApiClient, request);
        pendingResult.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
            @Override
            public void onResult(@NonNull DataApi.DataItemResult dataItemResult) {
                com.google.android.gms.common.api.Status status = dataItemResult.getStatus();

                DataItem dataItem = dataItemResult.getDataItem();
                boolean dataValid = dataItemResult.getDataItem().isDataValid();
                boolean canceled = status.isCanceled();
                boolean interrupted = status.isInterrupted();
                float statusCode = status.getStatusCode();


                if(status.isSuccess()){ // expected to be false because there is no bluetooth connection anymore
                    Log.d(TAG, "Success");
                }else{
                    Log.d(TAG, "Failure");
                }
            }
        });
        return null;
    }
}

为什么我没有得到 status.isSuccess 的错误信息?

我找到的唯一解决方案是在 AsyncTask 中编写以下代码:

Wearable.NodeApi.getConnectedNodes(googleApiClient).await().getNodes();
if(connectedNodes.size() == 0){
    // no connection
}

是否无法在 ResultCallback 中检查请求是否成功?

【问题讨论】:

    标签: android wear-os google-api-client


    【解决方案1】:

    我相信getStatus()DataItemResult 的调用仅表明调用是否成功传递给Data API,不是是否成功中继到另一个节点。 Data API 是异步的 - 它是一种“存储和转发”架构 - 因此期望它立即通知您成功交付是不合理的。

    事实上,我认为没有办法通过数据 API 确定您的 DataItem 何时交付。您的getConnectedNodes 技术只是告诉您手表已连接,而不是数据已发送。如果您需要交付证明,您可能必须自己实现,可能使用 Message API。

    另一个注意事项:如果您已将代码包装在 AsyncTask 中,则无需使用 PendingResult.setResultCallback。您可以简单地await 内联结果:http://developer.android.com/training/wearables/data-layer/events.html#sync-waiting

    【讨论】:

      猜你喜欢
      • 2019-04-02
      • 1970-01-01
      • 2016-07-03
      • 2013-09-24
      • 2021-04-13
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多