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,适配条目分为接收到的消息和发出去的消息,一个在左,一个在右。在监听到发出去消息,和收到消息的时候,更新适配的数据就行了~

 

 

 

 note:
//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

 
posted @ 2021-01-07 00:36  vocus  阅读(464)  评论(0编辑  收藏  举报