DataApi 是否可靠且几乎是实时的?极度延迟
Is DataApi Reliable and Practically Real Time? Extremely Delayed
我有一个 Android Wear 应用程序在市场上销售了大约 10 个月,但它停止工作了(不确定它何时停止工作)。
我正在尝试使用我在移动应用程序中记录的一些统计数据来更新我的可穿戴应用程序。正如我所说,这曾经工作得很好而且可靠。我什至为此添加了时间戳,因此它是独一无二的,因为 onDataChanged
仅在数据发生变化时才会被调用。这保证了。
我的问题
我可以通过调用 Wearable.DataApi.putDataItem
提交 PutDataMapRequest
罚款,我在 ResultCallback
.
中收到成功的回调
通常最后会调用 onDataChanged
,但延迟比以前太多了。更重要的是,我知道它设置正确,因为我有一个我启动的应用程序,其中我有一个 Activity
我去获取 DataItems
并且那里有一个积压。我在 Activity
中也遇到与 onDataChanged
相同的问题。
我做了什么
- 确保 versionCode 和 versionName 在两个模块
build.gradle
文件中匹配。
- 确保
build.gradle
文件使用相同版本的支持和 google 服务库。
- 确保 类 都连接到
GoogleApiClient
- 确保数据每次都不同,以强制它在服务中调用
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
方法创建并启动前台通知,实际调用时效果很好。
如果您希望立即同步数据,您现在需要设置 urgent flag,否则框架会批量处理这些调用并在一次调用中完成,这意味着您最多可以看到 30 分钟的延迟;这是对最新的 Play 服务所做的更改,以便在不需要这种即时数据同步时节省电池电量。
我有一个 Android Wear 应用程序在市场上销售了大约 10 个月,但它停止工作了(不确定它何时停止工作)。
我正在尝试使用我在移动应用程序中记录的一些统计数据来更新我的可穿戴应用程序。正如我所说,这曾经工作得很好而且可靠。我什至为此添加了时间戳,因此它是独一无二的,因为 onDataChanged
仅在数据发生变化时才会被调用。这保证了。
我的问题
我可以通过调用 Wearable.DataApi.putDataItem
提交 PutDataMapRequest
罚款,我在 ResultCallback
.
通常最后会调用 onDataChanged
,但延迟比以前太多了。更重要的是,我知道它设置正确,因为我有一个我启动的应用程序,其中我有一个 Activity
我去获取 DataItems
并且那里有一个积压。我在 Activity
中也遇到与 onDataChanged
相同的问题。
我做了什么
- 确保 versionCode 和 versionName 在两个模块
build.gradle
文件中匹配。 - 确保
build.gradle
文件使用相同版本的支持和 google 服务库。 - 确保 类 都连接到
GoogleApiClient
- 确保数据每次都不同,以强制它在服务中调用
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
方法创建并启动前台通知,实际调用时效果很好。
如果您希望立即同步数据,您现在需要设置 urgent flag,否则框架会批量处理这些调用并在一次调用中完成,这意味着您最多可以看到 30 分钟的延迟;这是对最新的 Play 服务所做的更改,以便在不需要这种即时数据同步时节省电池电量。