0

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

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();

现在它第一次运行时,我得到一个数据事件。但是,下次我运行它时,我得到了 2 个具有相同 Uri 的 dataEvents,旧的和新的。等等。

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

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

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

4

2 回答 2

2

我想到了。我有以下代码:

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

但是,因为我从官网复制/粘贴了loadBitmapFromAsset ,我忘了仔细检查,发现里面有mGoogleApiClient.disconnect()这行。

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

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

于 2014-08-18T05:58:40.417 回答
0

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

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

于 2014-08-17T20:15:23.490 回答