多个手表的可穿戴 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;
}
我有一个带有 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;
}