I was doing a school project on Android Wearable for the past few days. A strange bug happened.
I used
Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq)for triggering
onDataChanged in
WearableListenerService. However, I noticed that sometimes
onDataChanged is not called even though the
putDataItem method has fired.
The strange thing is this bug only happens on the first call, subsequently the calls trigger normally. More interestingly, the bug only happens sometimes, once in a while, the first call will trigger normally.
Aftering debugging and getting nowhere, I decided to get help from stackoverflow. I found an answer that was relevant:
http://stackoverflow.com/a/24697312/1472186
The answer suggests adding a time field into the
DataMap so that the data is really changed every time. I did not think that was the cause of the problem, because I followed the online tutorial and had a count value in my
DataMap, which increments every time. This should have caused the data to change every time.
However, after I added the time field into the
DataMap, the bug disappeared. So it was true that my old implementation was not causing any changes. The count value did not work. After thinking through the process again, I figured out why.
The count did increase after each call, from 0 to 1, 2, 3, … However, those values are stored in the
DataMap within the wearable device, not on the phone. So it was possible that wearable device already has a
DataMap in which there is a data with count 0, although my phone app does not have the
DataMap yet. When I send a new
DataMap with count 0 from phone to the wearable, that
DataMap is already present on the wearable, and hence no change will be detected and
onDataChanged will not be triggered.
For time, since the current time is unique and always increasing, there would not be a case where the time in
DataMap on the phone already exists on the wearable, hence always triggering
onDataChanged.