注册

关于自己服务器与环信服务器,好友,群好友同步问题!解决 在分享几个意外心得

  在集成环信的时候,考虑到好友体系不能保存在环信,得放在的自己的服务,会出现一个问题,因为当成为好友的时候,环信SDK内部已经处理了2个人的好友关系,但是有可能出现自己本地没有该好友数据的尴尬情况,同时当有群组有新的成员加入的时候,有可能SDK的促发延迟,push延迟等系列问题,虽然环信SDK提供了全局 EMGroupChangeListener,但我开发过程中,因为遇到了几次延迟的情况,我暂时未用了回调,但是用到了个人全局EMContactListener的回调。
说下我的思路,1.如何避免新加的群好友,本地没有该数据的情况。
# 进入聊天页面的,我此时会加载群好友的接口,这个接口不是一次性获取所有的好友,而且通过上一次最后更新的时间取拉去数据。这最后一次,只要在这个时间段,个人数据发生了任何变化,例如常见人头像,名字等。都会返回给我,数据获取完后,把新的时间覆盖最后一次旧的时间。 这个接口获取完了后,难道就不调用了么?不是的,因为我在当前聊天页面的情况,也会有新的好友加入,所以我还要在另外一个地方处理,那就是适配器的这个方法notifyDataSetChanged 我直接贴代码
       if (mChatType == EaseConstant.CHATTYPE_GROUP) {
if (messages != null) {
for (int i = 0; i < messages.size(); i++) {
if (messages.get(i).direct() == EMMessage.Direct.RECEIVE) {

if (!((ChatActivity_) context).mCurrentGroupLists.containsKey(messages.get(i).getFrom())) {
if (!((ChatActivity_) context).isLoad
&& ((ChatActivity_) context).isFirst) {
((ChatActivity_) context).isLoad = true;
((ChatActivity_) context).gotoLoadGroup();
}
}
}
}
}
}
每次刷新的时候,我本地会判断,这个好友是否在我本地存在本地,如果不存在,我在去获取一次,通过布尔值去控制,避免多次调用,这样及时有在多的群好友,我都能够很好的最新的数据。
 
2.如何避免消息列表有红点,没有数据,或者有红点,有数据,但是本地没有缓存数据的情况
# 也跟群好友一样,通过时间段去查询,这个控制,全局EMContactListener这个回调来处理,促发一个获取好友列表接口。但是我做了一个万一的处理,如果不到新的数据,自己服务器挂了呢,或者网络异常呢,这样红点的情况依然存在,解决方案如下
    /**
* 如果刷新数据失败 这把没匹配的数据设置为已度 避免有红点没有新消息
*
* @param context
*/
private void getErrorUpdateUser(Context context) {
Map mCurrentLists = DbService.getInstance(context)
.MapUserModel();
List conversations = EMClient.getInstance().chatManager().getConversationsByType(EMConversation.EMConversationType.Chat);
for (EMConversation conversation : conversations) {

boolean flag = false;
if (!mCurrentLists.containsKey(conversation.getUserName())) {
conversation.markAllMessagesAsRead();
flag = true;
}
if (flag) {
EventBus.getDefault().post(new MyEvent.UpdataDBUsers(4));
EventBus.getDefault().post(new MyEvent.UpdateAllNewMessage(true, 0));

}
}
}
这样很有效果,我这样处理后,在也没有遇到有红点没点数据。 好了就这样些了。
 
分享几个小的意外心得。
1.环信录制声音动画,严重的内存暴增。环信一直都不想解决, 我就简单改下就可以了 不要直接取获取
drawable 每一个drawable是消耗内存的,好像不会自动回收。 我直接贴代码1.先是环信的
        micImages = new Drawable[] { getResources().getDrawable(R.drawable.ease_record_animate_01),
, };
2.改成用id获取
    micImages = new int[]{
R.drawable.record_animate_01,

};

2.如果打开消息提醒声音,如果并发的时候,铃声一直响,而且当你点击某个好友进入聊天详情的时候,会很卡,半天不动,那就说明你UI卡顿了,没出现ANR就不错了,解决处理,把提醒声音播放用异步处理,然而在是3秒内 只提醒一次声音。
 
3.在分享一个微信一样,置顶,勿打扰,业务,已经优化到最快。
 
 
好了就这些了,以上仅仅代表个人。谢谢!有比我好的想法,一起交流下
 
 
 
 
 

 
已邀请:
  漏了最后个业务  
    /**
* 获取所有会话
*
* @Return +
*/
private Map<String, EMConversation> loadConversationsWithRecentChat1() {
List<EMConversation> conversations = EMClient.getInstance().chatManager().getConversationsByType(EMConversation.EMConversationType.Chat);
conversations.addAll(EMClient.getInstance().chatManager().getConversationsByType(EMConversation.EMConversationType.ChatRoom));
Map<String, EMConversation> listData = new HashMap<>();
/**
*置顶 读
*/
List<UserRead> readsList = new ArrayList<UserRead>();
/**
* 置顶 未度
*/
List<UserRead> notReadsList = new ArrayList<UserRead>();
/**
* 没置顶 读
*/
List<UserRead> notTopRead = new ArrayList<UserRead>();
/**
* 没置顶 未读
*/
List<UserRead> notTopNotRead = new ArrayList<UserRead>();
for (EMConversation conversation : conversations) {
/**
* 筛选单人以及本地有的数据
*/
if (conversation.getUserName().equals(mKefu.getKefuId()) || mCurrentLists.containsKey(conversation.getUserName())
&& "Chat".equals(conversation.getType().toString().trim())) {

/**
* 获取置顶的用户
*/
if (mTopMap.containsKey(conversation.getUserName())) {
listData.put(conversation.getUserName(), conversation);
/**
*筛选未读 置顶
*/
if (mMapReads.containsKey(conversation.getUserName())) {

/**
* 已读 设置top的置顶时间
*/

notReadsList.add(new UserRead(null, DataManager.getInstance().getUserId(), conversation.getUserName(), true, conversation.getLastMessage().getMsgTime()));
} else {
/**
*筛选已读 置顶
* 如果没消息则用 置顶时间
*/
boolean flag = false;
if (conversation.getUnreadMsgCount() > 0) {
flag = true;
}

readsList.add(new UserRead(null, DataManager.getInstance().getUserId(), conversation.getUserName(), flag, mTopMap.get(conversation.getUserName()).getTime()));
}

} else {
if (conversation.getLastMessage() != null) {
listData.put(conversation.getUserName(), conversation);
/**
* 未置顶 未读
*/
if (mMapReads.containsKey(conversation.getUserName())) {

notTopRead.add(new UserRead(null, DataManager.getInstance().getUserId(), conversation.getUserName(), true, mMapReads.get(
conversation.getUserName()).getTime()));
} else {
boolean flag = false;

if (conversation.getUnreadMsgCount() > 0) {
flag = true;
}

/**
* 未置顶 已读
* 时间为最后消息事件
*/
notTopNotRead.add(new UserRead(null, DataManager.getInstance().getUserId(), conversation.getUserName(), flag, conversation.getLastMessage().getMsgTime()));
}
}
}
}
}
/**
* 排序已度置顶 未读
*/
sortUserReadTime(readsList);

/**
* 排序未读置顶 已读
*/
sortUserReadTime(notReadsList);

/**
* 排序未置顶 未读
*/
sortUserReadTime(notTopRead);

/**
* 排序未读置顶 已读
*/
sortUserReadTime(notTopNotRead);


/**
* 填充数据
*/
mReadDatasTemp.addAll(readsList);
mReadDatasTemp.addAll(notReadsList);
mReadDatasTemp.addAll(notTopRead);
mReadDatasTemp.addAll(notTopNotRead);
return listData;
}

要回复问题请先登录注册