本文介绍利用环信harmonyos sdk 注册监听及使用EventBus在不同的页面进行刷新。
怎么
注册监听 ChatMessageListener
接收消息,建议该监听在登录之前进行注册。如果在登录后进行注册,可能会出现登录成功消息已经接收了,没有触发给监听的情况。在新消息到来时,你会收到 onMessageReceived
的回调,消息接收时可能是一条,也可能是多条。你可以在该回调里遍历消息队列,解析并显示收到的消息。为了减少重复代码,下面将在初始化后进行设置监听,利用EventBus传递到所需要的页面。
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
let chatOption :ChatOptions = new ChatOptions("easemob-demo#support");
chatOption.setAutoLogin(true);
chatOption.setAppIDForPush("111703463")
ChatClient.getInstance().init(this.context,chatOption);
ChatPresenter.ChatPresenter();
}
2、ChatPresenter监听类,在监听类中进行注册所需要的监听
import { ChatClient, ChatMessage, ChatMessageListener,
} from 'easemob'
import EaseConstant from '../utils/EaseConstant'
import { EventBus } from '../utils/EventBus'
class ChatPresenter {
private msgListener: ChatMessageListener | undefined
ChatPresenter() {
//添加消息监听
this.onMessageListener()
}
//消息事件监听
onMessageListener() {
this.msgListener = {
onMessageReceived: (messages: ChatMessage[]): void => {
EventBus.send(EaseConstant.connected_change)
},
}
ChatClient.getInstance().chatManager()?.addMessageListener(this.msgListener);
}
}
let chatPresenter = new ChatPresenter()
export default chatPresenter as ChatPresenter
鸿蒙提供提供了在同一进程不同线程间,或同一进程同一线程内,发送和处理事件的能力,包括持续订阅事件、单次订阅事件、取消订阅事件,以及发送事件到事件队列的能力。 @ohos.events.emitter
封装前使用:emitter,下面我们先来看看官方示例:
对于事件通知,我们主要看两个交互操作:
// 事件传递的消息体
let eventData: emitter.EventData = {
data: {
"content": "c",
"id": 1,
}
};
let innerEvent: emitter.InnerEvent = {
eventId: 1, //事件的唯一标识,后续监听也是通过这个唯一值
priority: emitter.EventPriority.HIGH //事件被发送的优先级
};
emitter.emit(innerEvent, eventData);
let innerEvent: emitter.InnerEvent = {
eventId: 1 //和发送的唯一标识对应上
};
// 收到eventId为1的事件后执行回调函数
emitter.on(innerEvent, (eventData) => {
// eventData.data 即为上面发送的消息提
});
我们先来看看封装后 EventBus 的使用区别
export abstract class EventBus {
static send(
eventID: string,
eventData?: ChatMessage[]|UserInfo|string,
) {
let data: ChatMessage[]|UserInfo|string
if (eventData !== null && eventData !== undefined) {
data = eventData
}
emitter.emit(
eventID,
{
priority: emitter.EventPriority.HIGH
},
{
data: {
'data': eventData
}
},
);
}
static listen<T>(
eventID: string,
callback: (data?: T) => void,
) {
emitter.on(
eventID,
(eventData: emitter.EventData) => {
let data: ChatMessage[]|UserInfo|string = eventData.data!['data']
if (data == undefined) {
callback(undefined)
} else {
callback(data as T)
}
},
);
}
static cancel(eventID: string) {
emitter.off(eventID);
}
}
发送事件,这里传递的类型可以根据自己需要进行修改
注:这里需要发送消息id,通过消息id来获取消息body,因为sdk中Messages类中提供的是方法,如果直接传递Messages对象会出现获取不到情况。
EventBus.send(EaseConstant.message_change,messages.getMsgId())
接收到消息后将item移到最后,并且渲染到UI中。
EventBus.listen<string>(EaseConstant.message_change,(messagesId) => {
this.scroller.scrollEdge(Edge.End)
this.messages.push(ChatClient.getInstance().chatManager()?.getMessage(messagesId) as ChatMessage)
})
总结:EventBus提高了代码复用性,简化组件间的通信过程,降低耦合度。在鸿蒙系统中,通过分布式数据总线或Emitter类,实现跨组件的数据传递和通知。
注册环信即时通讯IM:https://console.easemob.com/user/register
环信IM集成文档:https://docs-im-beta.easemob.com/document/ios/quickstart.html