Приложение Android Mobile/Wear onMessageReceived вызывается несколько раз для одного сообщения

У меня есть базовое приложение для Android Wear, которое успешно использует уровень данных носимых устройств для отправки и получения сообщений между мобильным устройством и Wear.

Однако каждый раз, когда я отправляю сообщение (с мобильного устройства или устройства Wear), другой конец получает его несколько раз (например, от 5 до 17). Почему это не просто получено один раз? Насколько я могу судить, он отправляется только один раз.

После успешного подключения вот мой код для отправки сообщения (одинаковый на обоих концах):

private void sendMsgToWear(final String strMsg){

    new AsyncTask<Void, Void, List<Node>>(){

        @Override
        protected List<Node> doInBackground(Void... params) {
            return getNodes();
        }

        @Override
        protected void onPostExecute(List<Node> nodeList) {
            for(Node node : nodeList) {
                Log.v("DEVELOPER", "......Phone: Sending Msg: " + strMsg + " to node:  " + node.getId());

                PendingResult<MessageApi.SendMessageResult> result = Wearable.MessageApi.sendMessage(
                        mGoogleApiClient,
                        node.getId(),
                        strMsg,
                        null
                );

                result.setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {
                    @Override
                    public void onResult(MessageApi.SendMessageResult sendMessageResult) {
                        Log.v("DEVELOPER", "......Phone: " + sendMessageResult.getStatus().getStatusMessage());
                    }
                });
            }
        }
    }.execute();


}

private List<Node> getNodes() {
    List<Node> nodes = new ArrayList<Node>();
    NodeApi.GetConnectedNodesResult rawNodes =
            Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
    for (Node node : rawNodes.getNodes()) {
        nodes.add(node);
        nodeID = node.getId();
    }
    return nodes;
}

А вот как я получаю свою активность, которая реализует MessageApi.MessageListener:

@Override
public void onMessageReceived(MessageEvent messageEvent) {

    Log.d("DEVELOPER", "......Wear: successfully received phone to wear communication!");


}

Мой вывод на стороне отправки выглядит так:

07-11 10:54:57.646  26920-28711/com.wearTest.message V/DEVELOPER﹕ ......Phone: Sending Msg: testMessage to node:  6ecc099a-60f8-4c3d-90fe-fa2f248c6bf7
07-11 10:54:57.666  26920-26920/com.wearTest.message V/DEVELOPER﹕ ......Phone: null

И журналы приема:

07-11 10:54:57.962    5509-5672/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.962    5509-5610/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.962    5509-5660/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.962    5509-5521/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.962    5509-5539/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.972    5509-5570/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.972    5509-5604/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.972    5509-5601/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.972    5509-5566/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.972    5509-5520/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.972    5509-5582/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.972    5509-5567/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:57.982    5509-5587/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:58.002    5509-5581/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:58.052    5509-5581/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:58.052    5509-5587/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!
07-11 10:54:58.062    5509-5570/com.wearTest.message D/DEVELOPER﹕ ......Wear: successfully received phone to wear communication!

Заранее спасибо!


person KevinTydlacka    schedule 11.07.2014    source источник
comment
На всякий случай, вы проверили, что вы регистрируете приемник только один раз?   -  person matiash    schedule 11.07.2014
comment
О, спасибо матиаш! Тупой ход, вот и все.   -  person KevinTydlacka    schedule 11.07.2014
comment
Я рад, что это было так легко. :) Вы планируете удалить этот вопрос или мне добавить ответ?   -  person matiash    schedule 11.07.2014
comment
Давай, добавь ответ, чтобы я его принял... это сэкономит какой-то другой бедняге час бесплодной работы!   -  person KevinTydlacka    schedule 12.07.2014


Ответы (1)


MessageApi должен работать нормально. Просто будьте осторожны, вызывая addListener() только один раз, иначе вы получите уведомление несколько раз.

В качестве альтернативы добавьте соответствующие вызовы removeListener() (например, в onResume() / onPause()).

person matiash    schedule 11.07.2014