多个手表的可穿戴 DataAPI 同步问题(循环)

Wearable DataAPI syncing issue with multiple watches (Looping)

我有一个带有 phone 配套应用的表盘。它使用 Wearable.DataApi 来同步 phone 和 watch 之间的变化。我在手表或 phone 端进行了 DataApi.DataListener 设置和同步更改。 我对 phone 和 ONE 手表通信 没有任何问题。

问题是 当我有多个手表使用同一个表盘时,如果手表或 phone 侧的变化很快,它似乎进入了一个循环并且开始在所有设备上闪烁更改。因此,如果我通过点击手表来更改颜色,如果我快速按几次以执行此操作,则所有设备都会开始循环显示所有颜色,并且需要一些时间才能赶上并停止。

如果我慢慢改变选项就没有问题。我在 DataApi 侦听器中放置了一个日志,我看到两个 uri 都在进行更改,但在快速更改时似乎只是出于某种原因循环。有什么办法可以防止这种情况吗?

我知道这可能看起来不是什么大问题,但如果用户有 2 块手表并且不小心快速更改了一个或多个选项,它将从选项和/或颜色更改开始。我想防止这种情况发生。

这就是我在 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();
        }
    };

您应该能够通过过滤掉来自本地节点(即代码 运行 所在的设备)的 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;
}