Android Wearable: как получить текущую переменную с помощью DataApi?

Это код, основанный на событиях

    Wearable.DataApi.addListener(googleApiClient, new DataApi.DataListener() {
        @Override
        public void onDataChanged(DataEventBuffer dataEvents) {
            Log.i(tag, "on data changed " + dataEvents.toString());
            for (DataEvent event : dataEvents) {
                DataItem item = event.getDataItem();
                String path = item.getUri().getPath();
                if (path.equals(PATH_MAP)) {
                    DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
                    String dataValue = dataMap.getString(KEY_DATA);
                }
            }
        }
    }).setResultCallback(new ResultCallbacks<Status>() {
        @Override
        public void onSuccess(@NonNull Status status) {
            Log.i(tag, "success");
        }

        @Override
        public void onFailure(@NonNull Status status) {
            Log.i(tag, "failure");
        }
    });

Как прочитать dataValue, связанный с KEY_DATA, без использования шаблона слушателя? Мне это нужно, потому что иногда узлы не синхронизируются, даже если установлен срочный режим. В частности, обратный вызов onDataChanged вызывается только в случае изменения значений.

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

Я знаю, что есть MessageApi, но проблема та же, если устройство не в сети, сообщение теряется.


person user3290180    schedule 15.07.2016    source источник


Ответы (1)


Вы можете получить предыдущие значения из DataApi, используя один из getDataItems методов, описанных здесь: https://developers.google.com/android/reference/com/google/android/gms/wearable/DataApi.html

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

Wearable.DataApi.getDataItems(googleApiClient).setResultCallback(new ResultCallback<DataItemBuffer>() {
    @Override
    public void onResult(@NonNull DataItemBuffer buffer) {
        for (DataItem item : buffer) {
            if (item.getUri().getPath().equals(PATH_MAP)) {
               DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
               String dataValue = dataMap.getString(KEY_DATA);
             }
         }
     }
 });

и вернет все DataItem, отправленные вашим приложением в API. Вы можете получить доступ к значению KEY_DATA, как описано выше.

person String    schedule 16.07.2016
comment
У меня есть путь к карте, а не к предмету - person user3290180; 16.07.2016
comment
как мне получить значение KEY_DATA? - person user3290180; 16.07.2016