2013-03-17 83 views
2

我在爲Smack消息庫中建立適當的聊天時遇到問題。如果聊天是在本地啓動的,那麼它工作得很好,但如果聊天是從另一個客戶端啓動的,則會創建兩個不同的聊天線程,而不僅僅是需要的聊天線程。我的發送郵件的代碼如下:Smack聊天創建兩個線程

public void sendMessage(String input) throws XMPPException 
    { 
     Chat chat = connection.getChatManager().getThreadChat("[email protected]"); 
     if(chat != null) 
     { 
      System.out.println("Chat exists!"); 
      chat.addMessageListener(messageListener); 
     } 
     else 
     { 
      System.out.println("Create new chat"); 
      chat = connection.getChatManager().createChat("[email protected]", "[email protected]", messageListener); 
     System.out.println(chat.getThreadID()); 
     } 
     chat.sendMessage(input); 
    } 

下面我有我的偵聽器類來處理傳入消息。它最初是在程序初始化時設置的,因此登錄後可以直接收到消息,並建立聊天。它也可以在sendMessage函數中的messageListener變量中調用,你可以在上面看到。

class MyMessageListener implements MessageListener { 
     @Override 
     public void processMessage(Chat chat, Message message) { 
      String from = message.getFrom(); 
      String body = message.getBody(); 
      System.out.println(chat.getThreadID()); 
      System.out.println(String.format("Received message '%1$s' from %2$s", body, from));  
     } 
    } 

我對Smack庫非常陌生,發現可用的文檔和示例有點模糊。任何人都有任何指示我可以檢查是否在另一個客戶端上創建了聊天,並以某種方式獲取此聊天的線程ID,或者通過知道發送該消息的用戶的名稱從ChatManager中查找聊天對象?

回答

2

您需要註冊ChatManagerListener才能收聽傳入聊天,如文檔中的Incoming Chats部分所述。以這種方式創建的聊天監聽器將接收傳入的消息,假定它們使用相同的線程ID進行響應(並非所有客戶端都使用線程ID)。

順便說一下,您正在通過線索查找現有的聊天,但這不是傳入聊天的線程ID。您所顯示的代碼片段只會與您自己創建的聊天內容匹配,因此,每次發送消息時都沒有必要設置消息監聽器,您可能只需要一次參考即可是創造。

您必須從傳入的聊天中檢索線索ID才能正常工作,並假設傳入的聊天實際上具有聊天ID。

+0

我在代碼中有ChatManagerListener,可能是我應該在問題中提到的東西,但它在那裏。 我知道我的getThreadChat()調用存在問題,但我一直無法找到更好的解決方案。我已經查看了你提到的getUserChat()調用,並且沒有找到它的信息,而且就我所見,它不在文檔中。這是來自ChatManager的呼叫嗎?不幸的是,我沒有任何選擇通過JID獲取聊天。 – Joe 2013-03-18 15:41:47

+0

我的不好,那是一種私人方法。我編輯了我的答案。 – Robin 2013-03-18 21:26:21

+0

對不起,延遲迴復。我有另一個項目到期,不得不將工作重點轉移到我的最後期限。大部分你的回答建議我已經在我的代碼中實現了,但你的建議是正確的。我沒有正確地持有對聊天記錄的線索ID的引用。似乎現在工作得很好,每個聊天都有一個線程ID。謝謝您的幫助! :) – Joe 2013-03-24 15:05:18