WearableListenerService:多次调用 putDataItem()
WearableListenerService: calling putDataItem() multiple times
我有一个包含 10 个对象的列表,我需要将它们从手持设备发送到可穿戴设备。发送对所有这些都非常有效,但是 onDataChanged() 只被触发了 2 次,而且第一次似乎是随机的。所以我重新创建了具有相同结果的完全相同的问题:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = findViewById(R.id.button);
mDataClient = Wearable.getDataClient(this);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for(int i = 0; i < 10; i++) {
//own mock up class with string id of i to differ them
Model model = new Model(String.valueOf(i)
, "title"
, new Date().getTime());
sendDataToWear(model);
}
}
});
}
private void sendDataToWear(Model model) {
PutDataMapRequest putDataMapRequest = PutDataMapRequest.create("/my_path");
putDataMapRequest.getDataMap().putString("id", model.getId());
putDataMapRequest.getDataMap().putString("title", model.getTitle());
putDataMapRequest.getDataMap().putLong("timestamp", model.getTimeStamp());
PutDataRequest putDataRequest = putDataMapRequest.asPutDataRequest();
Task<DataItem> putDataTask = mDataClient.putDataItem(putDataRequest);
putDataTask.addOnSuccessListener(new OnSuccessListener<DataItem>() {
@Override
public void onSuccess(DataItem dataItem) {
Log.d(TAG, "onSuccess: dataitem");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG, "onFailure: dataitem " + e.getMessage());
}
});
}
使用正确的负载调用 onSuccess 日志 10 次。
可穿戴设备 activity 实现了 OnDataChangeListener:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Wearable.getDataClient(this).addListener(this);
}
@Override
public void onDataChanged(@NonNull DataEventBuffer dataEventBuffer) {
for(DataEvent event : dataEventBuffer) {
if(event.getType() == DataEvent.TYPE_CHANGED) {
DataItem item = event.getDataItem();
if(item.getUri().getPath().compareTo("/my_path") == 0) {
DataMap map = DataMapItem.fromDataItem(item).getDataMap();
Log.d(TAG, "onDataChanged: name: " + map.getString("id"));
}
}
}
}
onDataChanged 日志被调用了 2 次,第一次总是不同,第二次总是 9 次。我不知道发生了什么。我还在 putDataItem() 调用之间以 1 秒的等待时间对其进行了测试,并且它按预期工作。 onDataChanged 方法被调用 10 次并传输 10 个有效负载。但我不能在每次通话之间等待一秒钟。有人知道这里发生了什么吗?
你所有的请求都是用相同的路径创建的,所以后面的请求会覆盖前面的 - 如果这发生在前面的请求被发送到 phone 之前(很可能),它会只收最后一个
要发送不同的项目,请在 PutDataMapRequest.create()
调用中使用不同的路径。最好创建一个路径来合理区分每个项目(例如以唯一 ID 结尾的路径,如“/my_path/[item_id]”)。
我有一个包含 10 个对象的列表,我需要将它们从手持设备发送到可穿戴设备。发送对所有这些都非常有效,但是 onDataChanged() 只被触发了 2 次,而且第一次似乎是随机的。所以我重新创建了具有相同结果的完全相同的问题:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = findViewById(R.id.button);
mDataClient = Wearable.getDataClient(this);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for(int i = 0; i < 10; i++) {
//own mock up class with string id of i to differ them
Model model = new Model(String.valueOf(i)
, "title"
, new Date().getTime());
sendDataToWear(model);
}
}
});
}
private void sendDataToWear(Model model) {
PutDataMapRequest putDataMapRequest = PutDataMapRequest.create("/my_path");
putDataMapRequest.getDataMap().putString("id", model.getId());
putDataMapRequest.getDataMap().putString("title", model.getTitle());
putDataMapRequest.getDataMap().putLong("timestamp", model.getTimeStamp());
PutDataRequest putDataRequest = putDataMapRequest.asPutDataRequest();
Task<DataItem> putDataTask = mDataClient.putDataItem(putDataRequest);
putDataTask.addOnSuccessListener(new OnSuccessListener<DataItem>() {
@Override
public void onSuccess(DataItem dataItem) {
Log.d(TAG, "onSuccess: dataitem");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG, "onFailure: dataitem " + e.getMessage());
}
});
}
使用正确的负载调用 onSuccess 日志 10 次。 可穿戴设备 activity 实现了 OnDataChangeListener:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Wearable.getDataClient(this).addListener(this);
}
@Override
public void onDataChanged(@NonNull DataEventBuffer dataEventBuffer) {
for(DataEvent event : dataEventBuffer) {
if(event.getType() == DataEvent.TYPE_CHANGED) {
DataItem item = event.getDataItem();
if(item.getUri().getPath().compareTo("/my_path") == 0) {
DataMap map = DataMapItem.fromDataItem(item).getDataMap();
Log.d(TAG, "onDataChanged: name: " + map.getString("id"));
}
}
}
}
onDataChanged 日志被调用了 2 次,第一次总是不同,第二次总是 9 次。我不知道发生了什么。我还在 putDataItem() 调用之间以 1 秒的等待时间对其进行了测试,并且它按预期工作。 onDataChanged 方法被调用 10 次并传输 10 个有效负载。但我不能在每次通话之间等待一秒钟。有人知道这里发生了什么吗?
你所有的请求都是用相同的路径创建的,所以后面的请求会覆盖前面的 - 如果这发生在前面的请求被发送到 phone 之前(很可能),它会只收最后一个
要发送不同的项目,请在 PutDataMapRequest.create()
调用中使用不同的路径。最好创建一个路径来合理区分每个项目(例如以唯一 ID 结尾的路径,如“/my_path/[item_id]”)。