在移动设备上,通过服务,我使用相同的路径使用以下代码更新位图资源:
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。
随着时间的推移,如何避免在我的可穿戴设备上获得大量数据事件?
答案 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