前言
- 各位做APP社交模块的兄弟,你们还好吗?
如果项目对社交的需求不强烈的话,我们使用融云的IMKit自带的聊天和消息中心代码毫无压力,但是如果消息中心有其他的需求的话。
比如
- 其他模块的消息聚合到消息中心。(我的项目主要是这个)
- 升级提示消息等等
那么融云自身的ConversationListActivity
就不能满足需求了。所以我们需要自己来做消息的聚合,这样对消息的处理就要我们自己来了。所以我把在项目中的坑点记录一下。
坑点一 任意界面来消息需要发通知除了当前聊天界面
处理方式:在HomeApplication中读写mCurrentPrivateUserId
//记录当前私聊的对方ID,用于判断来消息是否弹出提示
private String mCurrentPrivateUserId = "";
public String getCurrentPrivateUserId() {
return mCurrentPrivateUserId;
}
public void setCurrentPrivateUserId(String id) {
mCurrentPrivateUserId = id;
}
坑点二 不同的人和多条消息需要不同的通知内容
这里就要构造新的通知内容,我坐了一个最简单的聚合,代码如下:
//记录用户对应的消息条数,用于通知显示
private Map<String, Integer> mMessageMap;
public String getNotificationText(MsgInfo msgInfo) {
//多个好友消息
if (mMessageMap.size() > 1) {
int userCount = mMessageMap.size();
int count = 0;
Iterator<Map.Entry<String, Integer>> iterator = mMessageMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
count += entry.getValue();
}
return userCount + "个好友给您发送了" + count + "条消息";
} else {
int count = mMessageMap.get(msgInfo.getPeerUserId());
if (count > 1) {
return "给您发送了" + count + "条消息";
} else {
return msgInfo.getMsgContent();
}
}
}
坑点三 未内存缓存的用户消息数目不正确
调用融云提供的未读消息有点问题,修正如下:
RongIM.getInstance().getUnreadCount(Conversation.ConversationType.PRIVATE,
userId,
new RongIMClient.ResultCallback<Integer>() {
@Override
public void onSuccess(Integer integer) {
if(integer > MAX_NUM) {
viewHolder.unReadCount.setText("···");
}else if(integer > 0){
viewHolder.unReadCount.setText(integer + "");
}else{
viewHolder.unReadCount.setText("1");
//融云获取用户信息是异步发消息从数据库去然后放入缓存列表中,
//未在融云缓存中的用户该接口无效
Message message = new Message();
message.what = 2;
message.obj = userId;
RongUserInfoManager.getInstance().handleMessage(message);
}
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
}
});
坑点四 网络异常情况下,进入单聊界面未及时重连
这里就简单了,在单聊界面onResume
中判断重连
@Override
protected void onResume() {
super.onResume();
if (!HomeApplication.getInstance().isRongConnect()){
//重连
}
}
public boolean isRongConnect() {
return isRongConnect;
}
public void setRongConnect(boolean connect) {
isRongConnect = connect;
}
private class MyConnectionStatusListener implements RongIMClient.ConnectionStatusListener {
@Override
public void onChanged(ConnectionStatus connectionStatus) {
switch (connectionStatus) {
case CONNECTED://连接成功。
setRongConnect(true);
break;
case DISCONNECTED://断开连接。
setRongConnect(false);
break;
case CONNECTING://连接中。
break;
case NETWORK_UNAVAILABLE://网络不可用。
setRongConnect(false);
break;
case KICKED_OFFLINE_BY_OTHER_CLIENT://用户账户在其他设备登录,本机会被踢掉线
setRongConnect(false);
Toast.makeText(HomeApplication.getInstance(), "用户在其他设备登录", Toast.LENGTH_SHORT).show();
logout();
break;
}
}
}
最后
使用融云目前来看还是很稳定的,点赞。