PendingResult.setResultCallback()始终返回statusCode成功

时间:2016-04-25 10:05:10

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

如果我成功连接我的谷歌手表与移动设备,然后禁用蓝牙连接(出于测试原因)并对我的移动设备进行谷歌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中检查请求是否成功?

1 个答案:

答案 0 :(得分:1)

我认为对getStatus()的{​​{1}}调用只是表明调用是否已成功传递给数据API,是否已成功中继到另一个节点。 Data API是异步的 - 它是&#34;存储和转发&#34;建筑 - 所以期望它在成功交付后立即通知您是不合理的。

事实上,我并不认为有一种方法可以在数据API中确定您的DataItemResult已经交付 。您的DataItem技术只会告诉您手表已连接,而不是数据已传送。如果您需要交付证明,您可能必须自己实现,可能使用Message API。

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