Проблема синхронизации Wearable DataAPI с несколькими часами (зацикливание)

У меня есть циферблат с сопутствующим приложением для телефона. Он использует Wearable.DataApi для синхронизации изменений между телефоном и часами. У меня есть настройка DataApi.DataListener и изменения синхронизации, сделанные на стороне часов или телефона. У меня нет проблем с обменом данными между телефоном и ОДНИМИ часами.

Проблема заключается в том, когда у меня есть несколько часов, использующих один и тот же циферблат, если изменения на стороне часов или телефона вносятся быстро, кажется, что они зацикливаются и начинают мигать изменения на всех устройствах. Поэтому, если я изменю цвет, нажав часы, если я нажму несколько раз быстро, чтобы сделать это, все устройства начнут переключаться между всеми цветами и потребуется некоторое время, прежде чем они догонят и остановятся.

Если я медленно меняю параметры, проблем не возникает. Я помещаю журнал в прослушиватель 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();
        }
    };

person BigDX    schedule 15.02.2017    source источник


Ответы (1)


Вы должны быть в состоянии избежать этого, отфильтровывая dataEvents, происходящие с локального узла (т. е. устройства, на котором выполняется код).

Получите идентификатор локального узла с помощью такого кода:

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;
}
person String    schedule 15.02.2017
comment
Это действительно работает, единственное, что мне не нравится в этом, это то, что устройство вносит изменения с задержкой, потому что оно вносит изменения на других узлах, а затем отправляет изменения обратно в исходное, внесшее изменение. небольшая цена, которую нужно заплатить, чтобы заставить его работать. Спасибо! - person BigDX; 15.02.2017