WearableListenerService:多次调用putDataItem()

问题描述 投票:0回答:1

我有一个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次。实现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个有效负载被转移。但我不能在每次通话之间等一秒钟。有人知道这里发生了什么吗?

android google-api wear-os
1个回答
1
投票

您的所有请求都是使用相同的路径创建的,因此以后的请求会覆盖之前的请求 - 如果在早先的请求发送到手机之前发生这种情况(很可能),它只会收到最后一个请求。

要发送不同的项目,请在PutDataMapRequest.create()调用中使用不同的路径。优选地,创建合理区分每个项目的路径(例如以唯一ID结尾的项目,如“/ my_path / [item_id]”)。

© www.soinside.com 2019 - 2024. All rights reserved.