2017-02-15 37 views
0

我有一个手机伴侣应用程序的表面。它使用Wearable.DataApi同步手机和手表之间的变化。我有一个DataApi.DataListener设置,并在手表或手机端进行同步更改。 我有一个电话和一个手表通信没有问题。可穿戴DataAPI同步问题与多个手表(循环)

问题是当我有多个手表使用相同的表盘时,如果手表或手机侧的变化很快进行,它似乎进入循环并开始闪烁所有设备上的变化。所以,如果我通过点击手表来改变颜色,如果我快速按几次,所有设备都会开始骑自行车穿过所有颜色,并且需要一段时间才能赶上和停止。

如果我慢慢更改选项没有问题。我在DataApi监听器中添加了一个日志,并且我看到了两个uri都在进行更改,但是由于某种原因,快速更改时似乎会出现循环。无论如何要防止这一点?

我知道这可能不是一个大问题,但如果用户有2个手表并意外快速更改选项或选项,它将从选项和/或颜色更改开始。我想防止这种情况发生。

这是怎么IM在onConnected方法

Wearable.DataApi.addListener(mGoogleApiClient, dataListener); 

加入我的听众,这是我监听方法

DataApi.DataListener dataListener = new DataApi.DataListener() { 
     @Override 
     public void onDataChanged(DataEventBuffer dataEvents) { 
      Log.d(TAG, "onDataChanged"); 

      for (DataEvent event : dataEvents) { 
       Log.d(TAG, "dataEvent.uri: " + event.getDataItem().getUri().toString()); 

       DataMap item = DataMapItem.fromDataItem(event.getDataItem()).getDataMap(); 

       /////other code to set data///// 

      } 
      updateCanvas(); 
     } 
    }; 

回答

0

您应该能够通过过滤掉dataEvents是源于避免这种本地节点(即代码运行的设备)。

获取本地节点ID代码:

NodeApi.GetLocalNodeResult nodeResult = Wearable.NodeApi.getLocalNode(googleApiClient).await(); 
String localNodeID = getLocalNodeResult.getNode().getId(); 

然后,把这样的代码你for循环里面做过滤:

Uri uri = item.getUri(); 
String nodeID = uri.getHost(); 
if (nodeID.equals(localNodeID)) { 
    // Skip changes originating on this device 
    continue; 
} 
+0

这不工作的唯一的东西我不不喜欢这样做的原因是设备进行更改时会有延迟,因为它会在其他节点上进行更改,然后将更改发回原始进行更改。尽管付出的代价很小。谢谢! – Bignadad