1

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

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

Мой выпуск

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

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

Что я сделал

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

Мой код

Mobile

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()); 
          } 
         } 
        }); 
} 

Wear

У меня есть служба, которая проходит 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 создает и запускает приоритетное уведомление, и это хорошо работает, когда он на самом деле называется.

+0

Ваше приложение использует службы Google Play 8.3? – ianhanniballake

+0

Да используются все последние библиотеки. – StuStirling

ответ

1

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

+0

Я предполагаю, что это изменилось в какой-то момент, потому что оно работало нормально? – StuStirling

+0

Это новое поведение по умолчанию в последней версии Служб Play. –