WearableListenerService: вызов putDataItem () несколько раз - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть список из 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. Я понятия не имею, что происходит.Я также проверил это с 1 секундой ожидания между вызовами putDataItem (), и он работает как задумано.Метод onDataChanged вызывается 10 раз, а 10 полезных данных передаются.Но я не могу ждать одну секунду между каждым звонком.Кто-нибудь знает, что здесь происходит?

1 Ответ

0 голосов
/ 20 февраля 2019

Все ваши запросы создаются по одному и тому же пути, поэтому более поздние запросы перезаписывают более ранние - и если это произойдет до того, как более ранние запросы будут отправлены на телефон (что вполне вероятно), он получит только последний.

Чтобы отправлять разные предметы, используйте разные пути в ваших PutDataMapRequest.create() вызовах.Желательно, чтобы создать путь, который разумно дифференцирует каждый элемент (например, тот, который заканчивается уникальным идентификатором, например "/my_path/[item_id]").

...