使用WearApi Data Sync的多个DataItem具有相同的Uri

时间:2014-08-16 19:07:11

标签: android wear-os android-wear-data-api

在移动设备上,通过服务,我使用相同的路径使用以下代码更新位图资源:

PutDataMapRequest dataMap = PutDataMapRequest.create("/result/1");
dataMap.getDataMap().putString(FIELD_NAME, name);
if(bitmap != null) {
    Asset asset = createAssetFromBitmap(bitmap);
    dataMap.getDataMap().putAsset(FIELD_IMAGE, asset);
}
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
        .putDataItem(mGoogleApiClient, request);
DataApi.DataItemResult result = pendingResult.await(5L, TimeUnit.SECONDS);

在可穿戴设备上,我正在观察如下变化:

@Override
public void onDataChanged(DataEventBuffer dataEvents) {
    for (DataEvent event : dataEvents) {
        if (event.getType() == DataEvent.TYPE_CHANGED) {
            Log.d(TAG, "DataItem changed: " + event.getDataItem().getUri().toString());
...
    dataEvents.release();

现在它第一次运行时,我得到一个dataEvent。但是,下次我运行它时,我会得到2个具有相同Uri的newData,旧的和新的。等等。

我认为在PutDatMapRequest.create()中使用相同的路径只会更新DataApi同步存储中的数据,并同步它。

我已经尝试了Wearable.DataApi.deleteDataItems(),但这只是给了我一个大的CHANGED和DELETED事件列表,所有事件都使用相同的Uri。

随着时间的推移,如何避免在我的可穿戴设备上获得大量数据事件?

2 个答案:

答案 0 :(得分:2)

我明白了。我有以下代码:

@Override
protected void onStop() {
    if ((mGoogleApiClient != null) && mGoogleApiClient.isConnected()) {
        Wearable.DataApi.removeListener(mGoogleApiClient, WearIpCamActivity.this);
        mGoogleApiClient.disconnect();
    }
    mIsConnected = false;

但是,因为我从official website复制/粘贴了loadBitmapFromAsset,所以我忘了仔细检查它,我发现它中有一行mGoogleApiClient.disconnect()。

这阻止了我的if块在onStop中执行,因此我的DataApi侦听器没有被删除。下次我运行我的应用程序时,我现在有两次相同的回调,OnDataChanged为同一个dataItem调用了两次。

从loadBitmapFromAsset中删除mGoogleApiClient.disconnect()解决了我的问题。

答案 1 :(得分:0)

日期项目由完整的uri唯一,其中包括首次创建项目的主机。您可能有多个具有相同路径的项目,但每个项目都有一个唯一的主机。

因此,如果你在一个主机上创建一个项目,然后在另一个主机上获取/ onDataChanged,你应该修改并将DataItem放入项目而不是创建一个新的DataItem.fromPath