2016-04-25 3 views
1

, если я подключу свой Google Watch с мобильным устройством успешно, а затем отключите соединение Bluetooth (по причинам тестирования) и сделайте клиентский вызов google api на моем мобильном устройстве, находящийся на рассмотрении результат всегда возвращает успех коды состояния, даже если его не преуспевающие, потому что нет более соединенийPendingResult.setResultCallback() всегда возвращает успех statusCode

асинхронной задача для запроса

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

Я считаю, что getStatus() призыв к DataItemResult только была ли успешно прошел вызов прочь к API данных, не ли оно успешно передано на другой узел. API данных асинхронен - ​​это архитектура «store and forward», поэтому неразумно ожидать, что он немедленно уведомит вас об успешной доставке.

Фактически, я не думаю, что есть способ определить из API данных, когда ваш DataItem был доставлен вообще. Ваша техника getConnectedNodes сообщает только, что часы подключены, а не то, что данные были доставлены. Если вам требуется подтверждение доставки, вам, вероятно, придется реализовать это самостоятельно, возможно, используя API сообщений.

Другое примечание: если вы завернули свой код в AsyncTask, нет необходимости использовать PendingResult.setResultCallback. Вы можете просто await результат inline: http://developer.android.com/training/wearables/data-layer/events.html#sync-waiting

Смежные вопросы