Является ли DataApi надежным и практичным в реальном времени? Чрезвычайно задерживается

У меня приложение Android Wear на рынке уже около 10 месяцев, и оно перестало работать (не уверен, когда оно перестало работать).

Я пытаюсь обновить свое носимое приложение статистикой, которую я записываю в своем мобильном приложении. Как я уже говорил, раньше это работало нормально и надежно. Я даже добавил временную метку к этому, чтобы она была уникальной как onDataChanged вызывается только если данные изменились. Это гарантирует это.

Мой вопрос

Я могу представить PutDataMapRequest хорошо по телефону Wearable.DataApi.putDataItem и я получаю успешный обратный звонок в моем ResultCallback,

onDataChanged обычно вызывается в конце, но задержка слишком велика и больше, чем раньше. Более того, я знаю, что он установлен правильно, потому что у меня есть приложение, которое я запускаю, в котором у меня есть Activity что я иду и получить DataItems и там есть отставание. У меня та же проблема с onDataChanged в этом Activity также.

Что я сделал

  1. Убедитесь, что versionCode и versionName совпадают для обоих модулей build.gradle файлы.
  2. Обеспечены оба build.gradle файлы используют те же версии библиотек службы поддержки и Google.
  3. Убедитесь, что оба класса подключены к GoogleApiClient
  4. Удостоверился, что данные каждый раз отличаются, чтобы заставить его звонить onDataChanged в сервисе. Мне это не нужно, а просто чтобы оно заработало.

Мой код

мобильный

if (mGoogleApiClient.isConnected()) {
            PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(path);
            putDataMapRequest.getDataMap().putString("content", content);
            putDataMapRequest.getDataMap().putString("title", title);
            putDataMapRequest.getDataMap().putLong("timestamp", DateTime.now().getMillis());
            PutDataRequest request = putDataMapRequest.asPutDataRequest();    

            Wearable.DataApi.putDataItem(mGoogleApiClient, request)
                    .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                        @Override
                        public void onResult(DataApi.DataItemResult dataItemResult) {
                            if (!dataItemResult.getStatus().isSuccess()) {
                                Log.e("WearDevice", "buildWatchOnlyNotification(): Failed to set the data, "
                                        + "status: " + dataItemResult.getStatus().getStatusCode());
                            } else {
                                    Log.d(LOG_TAG, "Notificaiton result callback returned successfully: "+dataItemResult.getDataItem().toString());//: "+node.getDisplayName());
                            }
                        }
                    });
}

носить

У меня есть сервис, который расширяет WearableListenerService, Это заявлено в манифесте так.

<service android:name=".NotificationUpdateService">
            <intent-filter>
                <action android:name="com.google.android.gms.wearable.BIND_LISTENER"/>
            </intent-filter>
        </service>

Вот мой сервис.

@Override
    public void onCreate() {
        super.onCreate();

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Wearable.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        mGoogleApiClient.connect();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        if (MainActivity.DEBUGGING)
            Log.d(LOG_TAG, "onDataChanged");
        for (DataEvent dataEvent : dataEvents) {

            if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
                DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
                String content = dataMap.getString("content");
                String title = dataMap.getString("title");
                if ("/mydatapath".equals(dataEvent.getDataItem().getUri().getPath())) {
                    buildWearableOnlyNotification(title, content, false);
                }
            }
        }
    }

buildWearableOnlyNotification Метод создает и запускает уведомление переднего плана, и это прекрасно работает, когда он на самом деле вызывается.

1 ответ

Решение

Теперь вам нужно установить флаг срочности, если вы хотите, чтобы ваши данные были синхронизированы немедленно, иначе фреймворк будет группировать эти вызовы и делать их за один вызов, что означает, что вы можете увидеть задержку до 30 минут; это изменение, внесенное в самые последние сервисы Play для сохранения заряда батареи, когда такая немедленная синхронизация данных действительно не требуется.