Несколько элементов данных с одним и тем же Uri с использованием синхронизации данных WearApi

На мобильном устройстве из службы я использую тот же путь для обновления растрового ресурса, используя следующий код:

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, старым и новым. И так далее.

Я думал, что использование того же пути в PutDatMapRequest.create() просто обновит данные в хранилище синхронизации DataApi и синхронизирует их.

Я пробовал Wearable.DataApi.deleteDataItems(), но это просто дает мне большой список событий CHANGED и DELETED, все с одним и тем же Uri.

Как мне избежать множества событий данных на моем носимом устройстве с течением времени?


person barkside    schedule 16.08.2014    source источник


Ответы (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 вызывался дважды для одного и того же элемента данных.

Удаление mGoogleApiClient.disconnect() из loadBitmapFromAsset решило мою проблему.

person barkside    schedule 18.08.2014

Элемент даты уникален по полному uri, который включает узел, который первым создал элемент. У вас может быть несколько элементов с одним и тем же путем, но каждый из них будет иметь уникальный хост.

Таким образом, если вы создаете элемент на одном хосте, а затем fetch/onDataChanged на другом хосте, вам следует изменить и поместить элемент DataItem, а не создавать новый DataItem.fromPath.

person jlapenna    schedule 17.08.2014
comment
К сожалению, как указано в вопросе, мой URI одинаков (хост тот же) в каждом элементе. - person barkside; 18.08.2014