跳转到主要内容
频道(Channel)在 WuKongIM 中是一个比较抽象的概念。发送消息都是先发送给频道,频道根据自己的配置规则进行投递消息,频道分频道和频道详情。
需要实现获取频道资料的数据源: 获取频道资料数据源

频道资料管理

获取频道资料

获取 channel 信息,先获取内存,如果没有再从数据库获取:
// 获取channel信息 先获取内存 如果没有再从数据库获取
WKIM.getInstance().getChannelManager().getChannel(String channelID, byte channelType);

强制刷新频道资料

从远程服务器获取 channel 信息:
// 从远程服务器获取channel信息
WKIM.getInstance().getChannelManager().fetchChannelInfo(String channelID, byte channelType);

完整使用示例

public class ChatActivity extends AppCompatActivity {
    
    private String channelID;
    private byte channelType;
    private WKChannel currentChannel;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
        
        // 添加频道刷新监听
        WKIM.getInstance().getChannelManager().addOnRefreshChannelInfo("ChatActivity", new IRefreshChannel() {
            @Override
            public void onRefreshChannel(WKChannel channel, boolean isEnd) {
                if (channel.channelID.equals(channelID) && channel.channelType == channelType) {
                    runOnUiThread(() -> {
                        currentChannel = channel;
                        updateChannelUI();
                    });
                }
            }
        });
        
        // 加载频道信息
        loadChannelInfo();
    }
    
    private void loadChannelInfo() {
        // 先从本地获取
        currentChannel = WKIM.getInstance().getChannelManager().getChannel(channelID, channelType);
        
        if (currentChannel != null) {
            // 本地有数据,直接使用
            updateChannelUI();
        } else {
            // 本地没有数据,从服务器获取
            WKIM.getInstance().getChannelManager().fetchChannelInfo(channelID, channelType);
            showLoadingState();
        }
    }
    
    private void updateChannelUI() {
        // 更新标题
        setTitle(currentChannel.channelRemark != null ? currentChannel.channelRemark : currentChannel.channelName);
        
        // 更新头像
        loadAvatar(currentChannel.avatar);
        
        // 更新置顶状态
        updateTopStatus(currentChannel.top == 1);
        
        // 更新免打扰状态
        updateMuteStatus(currentChannel.mute == 1);
        
        hideLoadingState();
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 移除监听器
        WKIM.getInstance().getChannelManager().removeRefreshChannelInfo("ChatActivity");
    }
}

事件监听

刷新频道资料监听

// 监听channel刷新事件
WKIM.getInstance().getChannelManager().addOnRefreshChannelInfo("key", new IRefreshChannel() {
    @Override
    public void onRefreshChannel(WKChannel channel, boolean isEnd) {
        // 处理频道信息更新
        runOnUiThread(() -> {
            updateChannelInfo(channel);
        });
    }
});

// 移除监听
WKIM.getInstance().getChannelManager().removeRefreshChannelInfo("key");
key为监听的唯一标识,可以为任意字符串,添加监听和移出监听时需要传入相同的key

频道头像更新监听

// 监听频道头像更新事件
WKIM.getInstance().getChannelManager().addOnRefreshChannelAvatar(new IRefreshChannelAvatar() {
    @Override
    public void onRefreshChannelAvatar(String channelID, byte channelType) {
        // 头像需要本地修改
        String key = UUID.randomUUID().toString().replace("-", "");
        WKIM.getInstance().getChannelManager().updateAvatarCacheKey(channelID, channelType, key);
        
        // 刷新UI中的头像
        runOnUiThread(() -> {
            refreshChannelAvatar(channelID, channelType);
        });
    }
});

常用操作方法

修改备注

// 修改频道备注
WKIM.getInstance().getChannelManager().updateRemark(String channelID, byte channelType, String remark);

置顶/取消置顶

// 置顶频道 1.置顶 0.取消置顶
WKIM.getInstance().getChannelManager().updateTop(String channelID, byte channelType, int isTop);

保存频道资料

// 保存频道资料
WKIM.getInstance().getChannelManager().saveOrUpdateChannel(WKChannel channel);

// 批量保存频道资料
WKIM.getInstance().getChannelManager().saveOrUpdateChannels(List<WKChannel> list);

操作示例

public class ChannelSettingsActivity extends AppCompatActivity {
    
    private WKChannel channel;
    
    // 修改频道备注
    private void updateChannelRemark(String newRemark) {
        WKIM.getInstance().getChannelManager().updateRemark(
            channel.channelID, 
            channel.channelType, 
            newRemark
        );
        
        // 同时调用服务器API同步
        ApiManager.updateChannelRemark(channel.channelID, channel.channelType, newRemark, 
            new ApiCallback<Void>() {
                @Override
                public void onSuccess(Void result) {
                    runOnUiThread(() -> {
                        showToast("备注修改成功");
                        // 更新本地显示
                        channel.channelRemark = newRemark;
                        updateUI();
                    });
                }
                
                @Override
                public void onError(int code, String message) {
                    runOnUiThread(() -> {
                        showToast("备注修改失败: " + message);
                    });
                }
            });
    }
    
    // 切换置顶状态
    private void toggleTopStatus() {
        int newTopStatus = channel.top == 1 ? 0 : 1;
        
        WKIM.getInstance().getChannelManager().updateTop(
            channel.channelID, 
            channel.channelType, 
            newTopStatus
        );
        
        // 同时调用服务器API同步
        ApiManager.updateChannelTop(channel.channelID, channel.channelType, newTopStatus == 1,
            new ApiCallback<Void>() {
                @Override
                public void onSuccess(Void result) {
                    runOnUiThread(() -> {
                        channel.top = newTopStatus;
                        updateTopButton();
                        showToast(newTopStatus == 1 ? "已置顶" : "已取消置顶");
                    });
                }
                
                @Override
                public void onError(int code, String message) {
                    runOnUiThread(() -> {
                        // 恢复原状态
                        WKIM.getInstance().getChannelManager().updateTop(
                            channel.channelID, 
                            channel.channelType, 
                            channel.top
                        );
                        showToast("操作失败: " + message);
                    });
                }
            });
    }
    
    // 批量更新频道信息
    private void batchUpdateChannels(List<WKChannel> channels) {
        // 批量保存到本地
        WKIM.getInstance().getChannelManager().saveOrUpdateChannels(channels);
        
        // 通知UI更新
        runOnUiThread(() -> {
            notifyChannelListChanged();
        });
    }
}

WKChannel 数据结构

频道属性

public class WKChannel {
    // 频道ID
    public String channelID;
    
    // 频道类型 1.为单聊 2.为群聊
    public byte channelType;
    
    // 频道名称
    public String channelName;
    
    // 频道备注(频道的备注名称,个人的话就是个人备注,群的话就是群别名)
    public String channelRemark;
    
    // 频道头像
    public String avatar;
    
    // 是否置顶
    public int top;
    
    // 免打扰
    public int mute;
    
    // 是否禁言
    public int forbidden;
    
    // 远程扩展
    public HashMap remoteExtraMap;
    
    // 本地扩展字段
    public HashMap extraMap;
}

属性说明

属性类型说明
channelIDString频道唯一标识
channelTypebyte频道类型(1=单聊,2=群聊)
channelNameString频道名称
channelRemarkString频道备注(个人备注或群别名)
avatarString频道头像URL
topint是否置顶(1=置顶,0=不置顶)
muteint是否免打扰(1=免打扰,0=不免打扰)
forbiddenint是否禁言(1=禁言,0=不禁言)
remoteExtraMapHashMap远程扩展字段
extraMapHashMap本地扩展字段

最佳实践

1. 频道信息缓存策略

public class ChannelInfoManager {
    
    private Map<String, WKChannel> channelCache = new ConcurrentHashMap<>();
    
    public WKChannel getChannelWithCache(String channelID, byte channelType) {
        String key = channelID + "_" + channelType;
        
        // 先从内存缓存获取
        WKChannel channel = channelCache.get(key);
        if (channel != null) {
            return channel;
        }
        
        // 从SDK获取
        channel = WKIM.getInstance().getChannelManager().getChannel(channelID, channelType);
        if (channel != null) {
            channelCache.put(key, channel);
            return channel;
        }
        
        // 触发网络请求
        WKIM.getInstance().getChannelManager().fetchChannelInfo(channelID, channelType);
        return null;
    }
    
    public void updateChannelCache(WKChannel channel) {
        String key = channel.channelID + "_" + channel.channelType;
        channelCache.put(key, channel);
    }
    
    public void clearCache() {
        channelCache.clear();
    }
}

2. 频道状态管理

public class ChannelStatusHelper {
    
    public static String getDisplayName(WKChannel channel) {
        // 优先显示备注,没有备注显示名称
        return !TextUtils.isEmpty(channel.channelRemark) ? 
               channel.channelRemark : channel.channelName;
    }
    
    public static boolean isTopChannel(WKChannel channel) {
        return channel.top == 1;
    }
    
    public static boolean isMuteChannel(WKChannel channel) {
        return channel.mute == 1;
    }
    
    public static boolean isForbiddenChannel(WKChannel channel) {
        return channel.forbidden == 1;
    }
    
    public static String getChannelTypeText(byte channelType) {
        switch (channelType) {
            case 1:
                return "单聊";
            case 2:
                return "群聊";
            default:
                return "未知";
        }
    }
}

3. 内存管理

@Override
protected void onDestroy() {
    super.onDestroy();
    
    // 移除所有频道相关监听器
    WKIM.getInstance().getChannelManager().removeRefreshChannelInfo("ActivityKey");
    WKIM.getInstance().getChannelManager().removeUpdateChannelAvatar("ActivityKey");
    
    // 清理引用
    currentChannel = null;
}

下一步