smack创建会话,收发消息
概述
点击联系人列表中的好友,跳转到聊天界面ChatActivity
①使用软件包org.jivesoftware.smack.chat2里的ChatManage类
软件包org.jivesoftware.smack.chat已过时。里面的createChat,addChatListener方法也不推荐使用
②相关函数
在chat2包的ChatManage类有以下方法:
boolean addIncomingListener(IncomingChatMessageListener listener)
为接收会话消息添加一个监听器(Add a new listener for incoming chat messages.)
boolean addOutgoingListener(OutgoingChatMessageListener listener)
为发送会话消息添加一个监听器(Add a new listener for outgoing chat messages.)
Chat chatWith(EntityBareJid jid)
与jid开始一个新的会话或者回复已有会话(Start a new or retrieve the existing chat with jid
.)
static ChatManager getInstanceFor(XMPPConnection connection)
获得ChatManage的一个实例
boolean removeIncomingListener(IncomingChatMessageListener listener)
移除一个接收会话消息监听器(Remove an incoming chat message listener.)
boolean removeOutgoingListener(OutgoingChatMessageListener listener)
移除一个发送会话消息监听器(Remove an outgoing chat message listener.)
void setXhmtlImEnabled(boolean xhtmlIm)
通知包含XHTML-IM的消息(Also notify about messages containing XHTML-IM.)
③简单的创建会话和收发消息代码
chatManage= ChatManager.getInstanceFor(conn)
监听和发送消息
//接收消息监听,发送消息 //貌似监听代码要写在发送消息代码之前 chatManage!!.addIncomingListener(object:IncomingChatMessageListener{ override fun newIncomingMessage(from: EntityBareJid?, message: Message?, chat: Chat?) { println("from:$from") println("message:$message") println("message:${message!!.body}") println("chat:$chat") } }) var jidStr=XmppStringUtils.completeJidFrom(friendName,conn!!.xmppServiceDomain.domain) //println("JidStr是:$jidStr") //与好友开启一个会话 var chat:Chat=chatManage!!.chatWith(JidCreate.entityBareFrom(jidStr)) //尝试发送一条消息 chat.send("~~~hello~~~my~~dear~friend") var msg: Message = Message() msg.body="a message" chat.send(msg)
运行:
这里我只是点击跳转到聊天界面就自动发两条消息。
④后续
聊天界面优化。大概就是一个RecyclerView,适配条目分为接收到的消息和发出去的消息,一个在左,一个在右。在监听到发出去消息,和收到消息的时候,更新适配的数据就行了~
//Only the original thread that created a view hierarchy can touch its views. runOnUiThread{ rcyAdapter.updateData(iMessageList) }
shu ru fa huai diao le~ai~ so be it
How to use notifyDataSetChanged() in thread