2016-04-25 9 views
1

, wenn ich meine Google Watch mit einem mobilen Gerät erfolgreich verbinden, und dann die Bluetooth-Verbindung deaktivieren (aus Testgründen) und einen Google API-Client-Anruf an mein mobiles Gerät ausstehen lassen Ergebnis liefert immer den Statuscode Erfolg, auch wenn sie nicht erfolgreiche, weil es keine Verbindung mehr istPendingResult.setResultCallback() liefert immer den StatusCode Erfolg

Asynchron-Aufgabe für die Anforderung

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; 
    } 
} 

warum ich keine falsche für status.isSuccess bekommen?

die einzige Lösung, die ich gefunden ist innerhalb der AsyncTask folgenden Code zu schreiben:

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

ist es nicht möglich zu überprüfen, ob die Anforderung erfolgreich innerhalb des ResultCallback war?

Antwort

1

Ich glaube, dass der getStatus() Aufruf für DataItemResult nur anzeigt, ob der Anruf erfolgreich wurde an den Daten-API ausgab, nicht ob es wurde erfolgreich an einem anderen Knoten weitergeleitet. Das Daten-API ist asynchron - es handelt sich um eine "Store and Forward" -Architektur - daher ist es nicht vernünftig zu erwarten, dass es Sie sofort über eine erfolgreiche Lieferung informiert.

Tatsächlich glaube ich nicht, dass es eine Möglichkeit gibt, aus der Daten-API zu bestimmen, wenn Ihre DataIteman alle geliefert wurde. Ihre getConnectedNodes Technik sagt Ihnen nur, dass die Uhr verbunden ist, nicht dass die Daten geliefert wurden. Wenn Sie einen Zustellnachweis benötigen, müssen Sie das wahrscheinlich selbst implementieren, möglicherweise mithilfe der Nachrichten-API.

Noch ein Hinweis: Wenn Sie Ihren Code in eine AsyncTask verpackt haben, müssen Sie PendingResult.setResultCallback nicht verwenden. Sie können einfach await das Ergebnis inline: http://developer.android.com/training/wearables/data-layer/events.html#sync-waiting

Verwandte Themen