环信 Harmonyos IM SDK关于监听的实现及跨页面刷新UI 页面

本文介绍利用环信harmonyos sdk 注册监听及使用EventBus在不同的页面进行刷新。

一、 EventBus‌简介

怎么

二、接收消息监听

注册监听 ChatMessageListener 接收消息,建议该监听在登录之前进行注册。如果在登录后进行注册,可能会出现登录成功消息已经接收了,没有触发给监听的情况。在新消息到来时,你会收到 onMessageReceived 的回调,消息接收时可能是一条,也可能是多条。你可以在该回调里遍历消息队列,解析并显示收到的消息。为了减少重复代码,下面将在初始化后进行设置监听,利用EventBus传递到所需要的页面。

1、在EntryAbility 中进行初始化设置
  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
三、EventBus介绍

鸿蒙提供提供了在同一进程不同线程间,或同一进程同一线程内,发送和处理事件的能力,包括持续订阅事件、单次订阅事件、取消订阅事件,以及发送事件到事件队列的能力。 @ohos.events.emitter

Emitter

封装前使用:emitter,下面我们先来看看官方示例:

对于事件通知,我们主要看两个交互操作:

1、发送
// 事件传递的消息体
let eventData: emitter.EventData = {
    data: {
        "content": "c",
        "id": 1,
    }
};
 
let innerEvent: emitter.InnerEvent = {
    eventId: 1, //事件的唯一标识,后续监听也是通过这个唯一值
    priority: emitter.EventPriority.HIGH //事件被发送的优先级
};
 
emitter.emit(innerEvent, eventData);
2、监听
let innerEvent: emitter.InnerEvent = {
  eventId: 1 //和发送的唯一标识对应上
};
 
// 收到eventId为1的事件后执行回调函数
emitter.on(innerEvent, (eventData) => {
  // eventData.data 即为上面发送的消息提
});
EventBus封装

我们先来看看封装后 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);
  }
}

发送事件,这里传递的类型可以根据自己需要进行修改

四、项目中的使用
1、接收到消息时发送

注:这里需要发送消息id,通过消息id来获取消息body,因为sdk中Messages类中提供的是方法,如果直接传递Messages对象会出现获取不到情况。

EventBus.send(EaseConstant.message_change,messages.getMsgId())
2、监听接收到的消息

接收到消息后将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

你可能感兴趣的:(harmonyos,ui,华为)