需要实现获取频道资料的数据源: 获取频道资料数据源
频道资料管理
获取频道资料
获取 channel 信息,先获取内存,如果没有再从数据库获取:Copy
// 获取channel信息 先获取内存 如果没有再从数据库获取
WKIM.getInstance().getChannelManager().getChannel(String channelID, byte channelType);
强制刷新频道资料
从远程服务器获取 channel 信息:Copy
// 从远程服务器获取channel信息
WKIM.getInstance().getChannelManager().fetchChannelInfo(String channelID, byte channelType);
完整使用示例
Copy
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");
}
}
事件监听
刷新频道资料监听
Copy
// 监听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
频道头像更新监听
Copy
// 监听频道头像更新事件
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);
});
}
});
常用操作方法
修改备注
Copy
// 修改频道备注
WKIM.getInstance().getChannelManager().updateRemark(String channelID, byte channelType, String remark);
置顶/取消置顶
Copy
// 置顶频道 1.置顶 0.取消置顶
WKIM.getInstance().getChannelManager().updateTop(String channelID, byte channelType, int isTop);
保存频道资料
Copy
// 保存频道资料
WKIM.getInstance().getChannelManager().saveOrUpdateChannel(WKChannel channel);
// 批量保存频道资料
WKIM.getInstance().getChannelManager().saveOrUpdateChannels(List<WKChannel> list);
操作示例
Copy
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 数据结构
频道属性
Copy
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;
}
属性说明
| 属性 | 类型 | 说明 |
|---|---|---|
channelID | String | 频道唯一标识 |
channelType | byte | 频道类型(1=单聊,2=群聊) |
channelName | String | 频道名称 |
channelRemark | String | 频道备注(个人备注或群别名) |
avatar | String | 频道头像URL |
top | int | 是否置顶(1=置顶,0=不置顶) |
mute | int | 是否免打扰(1=免打扰,0=不免打扰) |
forbidden | int | 是否禁言(1=禁言,0=不禁言) |
remoteExtraMap | HashMap | 远程扩展字段 |
extraMap | HashMap | 本地扩展字段 |
最佳实践
1. 频道信息缓存策略
Copy
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. 频道状态管理
Copy
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. 内存管理
Copy
@Override
protected void onDestroy() {
super.onDestroy();
// 移除所有频道相关监听器
WKIM.getInstance().getChannelManager().removeRefreshChannelInfo("ActivityKey");
WKIM.getInstance().getChannelManager().removeUpdateChannelAvatar("ActivityKey");
// 清理引用
currentChannel = null;
}

