首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

環信 SDK 實戰:會話列表頁面開發與消息監聽機制詳解

     編輯:Java 綜合教學

前言:基於 EaseUI 快速構建 IM 會話列表

環信提供的 EaseConversationListFragment 封裝了會話列表的核心邏輯,開發者只需繼承並配置監聽器,即可實現消息實時刷新、點擊跳轉聊天頁等功能。本文詳細拆解關鍵代碼與實現原理。

頁面架構:繼承 EaseConversationListFragment

public class ConversationListFragment extends EaseConversationListFragment {
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        // 1. 註冊消息監聽
        EMClient.getInstance().chatManager().addMessageListener(msgListener);
        // 2. 設置條目點擊跳轉
        setConversationListItemClickListener(itemClickListener);
        // 3. 清空舊數據準備加載
        conversationList.clear();
    }
}

核心功能 1:消息變化監聽與列表刷新

private EMMessageListener msgListener = new EMMessageListener() {
    @Override
    public void onMessageReceived(List<EMMessage> messages) {
        // 通知通知欄顯示新消息
        EaseUI.getInstance().getNotifier().onNewMesg(messages);
        // 刷新會話列表 UI
        refresh();
    }
    // 其他回調按需實現...
    @Override public void onCmdMessageReceived(List<EMMessage> messages) {}
    @Override public void onMessageReadAckReceived(List<EMMessage> messages) {}
    @Override public void onMessageDeliveryAckReceived(List<EMMessage> messages) {}
    @Override public void onMessageChanged(EMMessage msg, Object change) {}
};

關鍵點:

  • onMessageReceived 在接收線程回調,需確保 refresh() 切換到主線程(EaseUI 內部已處理)
  • Notifier.onNewMesg() 負責系統通知欄顯示,與列表刷新分離

核心功能 2:會話條目點擊跳轉聊天頁

private EaseConversationListItemClickListener itemClickListener = 
    new EaseConversationListItemClickListener() {
        @Override
        public void onListItemClicked(EMConversation conversation) {
            Intent intent = new Intent(getActivity(), ChatActivity.class);
            // 傳遞會話 ID(單聊為用戶 ID,群聊為群組 ID)
            intent.putExtra(EaseConstant.EXTRA_USER_ID, conversation.conversationId());
            // 判斷會話類型
            if (conversation.getType() == EMConversation.EMConversationType.GroupChat) {
                intent.putExtra(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_GROUP);
            }
            startActivity(intent);
        }
    };

參數說明:

EXTRA_USER_IDEXTRA_CHAT_TYPE
Extra Key值來源說明
conversation.conversationId()單聊為對方環信 ID,群聊為群組 ID
CHATTYPE_GROUP / CHATTYPE_SINGLE標識會話類型,ChatActivity 据此加載不同布局/邏輯

生命週期管理:別忘了註銷監聽

@Override
public void onDestroy() {
    super.onDestroy();
    EMClient.getInstance().chatManager().removeMessageListener(msgListener);
    // 防止內存洩漏與重複回調
}

進階擴展:自定義會話列表項佈局

若需自定義項目佈局(如顯示未讀數、@提醒、置頂標識),可重寫:

@Override
protected View getViewForPosition(int position, View convertView, ViewGroup parent) {
    // 復用 ViewHolder 模式,綁定自定義佈局 R.layout.item_conversation_custom
    // 綁定 conversation 數據到 View
    return convertView;
}

總結

環信 EaseConversationListFragment 遵循「模板方法 + 監聽器」模式,核心只需三步:

  1. 註冊 EMMessageListener 接收消息變化 → refresh()
  2. 設置 OnItemClickListener 跳轉 ChatActivity 並傳遞會話標識
  3. 在 onDestroy 註銷監聽防洩漏

掌握這套流程,即可快速構建穩定、實時的 IM 會話列表頁面。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved