DataApi可靠且实时吗?极度延迟

时间:2015-11-24 18:17:59

标签: android wear-os google-api-client android-wear-data-api android-wear-notification

我在市场上已经安装了一个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。我不需要这个,只是为了让它发挥作用。
  5. 我的代码

    移动

    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 个答案:

答案 0 :(得分:1)

如果您希望立即同步数据,现在需要设置urgent flag,否则框架会批量处理这些呼叫并在一次呼叫中执行,这意味着您可以看到最多30分钟的延迟;这是在最近的Play服务中进行的更改,以便在不需要这种直接数据同步时保留电池。