2011-05-02 15 views
4

我使用了Android XMPP集成asmack API ...XMPP:Asmack連接PacketListener問題...

的XMPP連接的認證成功後,我已經使用PacketListener的傳入消息通知。

我的應用程序是基於選項卡的應用程序。當我通過單擊好友列表轉到聊天活動時,我的數據包偵聽器將添加到OnCreate方法中的連接中。

問題是,多次Im移動到這個屏幕上,這個監聽器的數量被添加,並且我得到相同的消息多次。

該問題的解決方案?

PacketFilter filter = new MessageTypeFilter(Message.Type.chat); 
     PacketListener pListener = new PacketListener() { 
      public void processPacket(Packet packet) { 
       Message message = (Message) packet; 
       if (message.getBody() != null) { 
        String fromName = StringUtils.parseBareAddress(message 
          .getFrom()); 
        Log.i("XMPPClient", "Got text [" + message.getBody() 
          + "] from [" + fromName + "]"); 
        messages.add(fromName + ":"); 
        messages.add(message.getBody()); 
        // Add the incoming message to the list view 
        mHandler.post(new Runnable() { 
         public void run() { 
          setListAdapter(); 
         } 
        }); 
       } 
      } 
     }; 

     connection.addPacketListener(pListener, filter); 

回答

0

我認爲更好的辦法是依賴於ChatManager來管理你的聊天記錄,發送和接收聊天 這是我做我的應用程序:

// Assume we've created a Connection name "connection". 
ChatManager chatmanager = connection.getChatManager(); 
Chat newChat = chatmanager.createChat("[email protected]", 
new MessageListener() { 
    public void processMessage(Chat chat, Message message) { 
     System.out.println("Received message: " + message); 
    } 
}); 

try { 
    newChat.sendMessage("Howdy!"); 
} 
catch (XMPPException e) { 
    System.out.println("Error Delivering block"); 
} 

以recive你說

消息
// Assume a MessageListener we've setup with a chat. 

    public void processMessage(Chat chat, Message message) { 
     // Send back the same text the other user sent us. 
     chat.sendMessage(message.getBody()); 
    } 

監聽其它聊天呼入

// Assume we've created a Connection name "connection". 
ChatManager chatmanager = connection.getChatManager().addChatListener(
    new ChatManagerListener() { 
     @Override 
     public void chatCreated(Chat chat, boolean createdLocally) 
     { 
      if (!createdLocally) 
       chat.addMessageListener(new MyNewMessageListener());; 
     } 
    }); 

這將使它更清潔比包過濾器

避免多重事件偵聽器登記註冊監聽器在onResume()方法則取消註冊onPause()

5

@Vishal。您不應該將此偵聽器添加到任何活動文件中,只需將這些偵聽器添加到您的Android服務中,這些偵聽器應始終與單個實例一起運行。

謝謝

2

我得到了同樣的問題。這就是我所做的,

OnResume() 
{ 
connection.removePacketListener(yourlistener); 
} 
+0

不工作,消息未收到。 – 2015-06-03 13:26:53

1

你不應該在你的活動生命週期中註冊監聽器。相反,創建一個Connection控制器的單例並將此偵聽器添加到該控制器中。