我在爲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中查找聊天對象?
我在代碼中有ChatManagerListener,可能是我應該在問題中提到的東西,但它在那裏。 我知道我的getThreadChat()調用存在問題,但我一直無法找到更好的解決方案。我已經查看了你提到的getUserChat()調用,並且沒有找到它的信息,而且就我所見,它不在文檔中。這是來自ChatManager的呼叫嗎?不幸的是,我沒有任何選擇通過JID獲取聊天。 – Joe 2013-03-18 15:41:47
我的不好,那是一種私人方法。我編輯了我的答案。 – Robin 2013-03-18 21:26:21
對不起,延遲迴復。我有另一個項目到期,不得不將工作重點轉移到我的最後期限。大部分你的回答建議我已經在我的代碼中實現了,但你的建議是正確的。我沒有正確地持有對聊天記錄的線索ID的引用。似乎現在工作得很好,每個聊天都有一個線程ID。謝謝您的幫助! :) – Joe 2013-03-24 15:05:18