使用环信时遇见最大的坑 呜呜呜呜~~

这篇其实就一句话:onMessageChanged(EMMessage message, Object change) 中的change别乱打印就行了

简介

公司项目要加即时通讯,于是我和老板说有两种方法 :一是自己撸 比如openfire+asmark ;二是 选择第三方的 。
老板二话没说 就选了第一种,于是我又和老板说 : 第一中开发成本大 而且不一定体育第三方做的好(其实我们公司肯定没有人家做的好啦!),老板沉思了一会问:“第三方的都有神马” 于是就说了一些常见的 网易云信、环信、融云这些。
老板上网搜了搜 说用’环信’吧。我们这些做开发的无所谓,用哪家都行 于是就选择了环信开始开发。

环信easeui

进入环信官网,选择了即时通讯云,看了下文档 发现有easeui这个东西,于是就和demo一起下载了,我看demo用的就是easeui,用的还算挺方便,已经打算用了,可是突然想到 公司的需求:发送图片、文字 即可。用这个是不是有点浪费资源了,于是打算自己撸一个,照着easeui,把该弄成自定义控件的 弄成自定义控件,该初始化的初始化……

做了一个小demo,登陆、注册、发送文本消息、接收消息(Log输出的),感觉都没问题了,然后就去撸界面了。我用的是RecyclerView。
写界面时候出了一下小问题,是view复用时候 错误现象,由于当时的马虎,耽搁了好久才解决

view复用错误总结:
            1. 加载的数据有网络数据,也就是异步加载显示的时候没有处理好
            2.  view使用前没有初始化一些设置,或者是使用后没有进行相关的设置。(这个就是我犯的错误,我的view默认隐藏,当消息类型变化时候忘记对其进行初始化的设置了)
            3. 数据绑定方法中的position使用错误(这个是一个5年经验的哥哥告诉我的)
            4. 消息类没有处理好(比如A类型 发送,B类型接收。绑定相应的布局)

终于发送的文本消息可以正常显示了,测试下发送图片消息吧,这可倒好 问题一下就来了,来的那么突然。

先看这两个接口:
EMCallBack 这个接口的发送消息的监听
EMMessageListener 这个接口是接收消息的监听

接收文本时候两个接口都正常工作。可是一旦接收了非文本类型消息时候就完蛋了。
可以显示本次接收的消息(比如这次接收的是图片消息),但是下次的消息就说什么都接收不到了,因为连监听里的log都没打。

EMMessageListener listener = new EMMessageListener() {
        @Override
        public void onMessageReceived(  List<EMMessage> mes) {
            Log.e(TAG, "收到消息:" + mes.toString());
        }

        @Override
        public void onCmdMessageReceived(List<EMMessage> messages) {
            //收到透传消息
            Log.e(TAG, "收到透传消息:" + messages.toString());
        }

        @Override
        public void onMessageReadAckReceived(List<EMMessage> messages) {
            //收到已读回执
            Log.e(TAG, "收到已读回执:" + messages.toString());
        }

        @Override
        public void onMessageDeliveryAckReceived(List<EMMessage> message) {
            //收到已送达回执
            Log.e(TAG, "收到已送达回执:" + message.toString());
        }

        @Override
        public void onMessageChanged(EMMessage message, Object change) {
            //消息状态变动
            Log.e(TAG, "消息状态变动:" + message.toString()+"---"+change.toString());
        }
    };

我们执行这些操作:发送“1111”、发送“2222”、发送图片消息、发送“3333”、发送“4444”;
这里写图片描述
先看理想情况情况的Log:
这里写图片描述
实际输出的Log:
这里写图片描述

反正当时的我是懵逼状态,遇到问题时候是周五,这个问题一直拖到下周二才解决(中间做了很多别的事情),由于公司没有技术大牛,只能靠我一个android ,与是我开始看官方的各种demo 什么完整版的、简版的 都去看了,不看还好,看了之后就又懵逼了,写的也没有错 问别人也没有错,问客服也没有错,但为什么就是不好使呢?

想想也怪,监听一次后就不好使了,其实不光EMMessageListener 不好使了,连EMCallBack也不好使了!!

去解决问题

于是我开始各种尝试:改变环境 换 jdk,换gradle 无果
环信的社区发帖,回复就是一套官腔,好像我骗他们似的 无果
让朋友看我代码 无果
更可气的是,新建demo,同样的测试,还是tmd不行~

于是我开始质疑sdk问题(现在想想也挺二的,人家那么多产品都跑着呢 怎么可能是sdk问题),又去骚扰客服, 到最后。。。。 客服一看见我的问题就知道是我了(可能也是巧合)

解决!

找了一个官方demo,把聊天界面的全部删掉,只剩下接收消息。测试 好使~

官方demo接收消息代码:

 EMMessageListener msgListener = new EMMessageListener() {

        @Override
        public void onMessageReceived(List<EMMessage> messages) {
            Log.e(TAG, messages.toString());
        }

        @Override
        public void onCmdMessageReceived(List<EMMessage> messages) {
            // 收到透传消息
        }

        @Override
        public void onMessageReadAckReceived(List<EMMessage> messages) {
            // 收到已读回执
        }

        @Override
        public void onMessageDeliveryAckReceived(List<EMMessage> message) {
            // 收到已送达回执
        }

        @Override
        public void onMessageChanged(EMMessage message, Object change) {
            // 消息状态变动
        }
    };

我将我自己的监听将其替换掉:

EMMessageListener listener = new EMMessageListener() {
        @Override
        public void onMessageReceived(  List<EMMessage> mes) {
            Log.e(TAG, "收到消息:" + mes.toString());
        }

        @Override
        public void onCmdMessageReceived(List<EMMessage> messages) {
            //收到透传消息
            Log.e(TAG, "收到透传消息:" + messages.toString());
        }

        @Override
        public void onMessageReadAckReceived(List<EMMessage> messages) {
            //收到已读回执
            Log.e(TAG, "收到已读回执:" + messages.toString());
        }

        @Override
        public void onMessageDeliveryAckReceived(List<EMMessage> message) {
            //收到已送达回执
            Log.e(TAG, "收到已送达回执:" + message.toString());
        }

        @Override
        public void onMessageChanged(EMMessage message, Object change) {
            //消息状态变动
            Log.e(TAG, "消息状态变动:" + change.toString());
        }
    };

于是发现又不好使了!!!
我开始检查包,接口名 方法名,都没问题。到最后我将所有Log都删掉—-测试发现,好使了~

于是我就懵逼了 究竟是哪个log影响了监听呢,到最后发现了onMessageChanged

只有将onMessageChanged参数中的 Object change 一输出,就会使所有监听都不好使。

onMessageChanged中的Object change是干什么的呢?
首先看环信文档中EMMessageListener的介绍:

EMMessageListener消息侦听接口,可以用来侦听消息接受情况,成功发送到对方手机后会有回执, 对方阅读了这条消息也会收到回执。 发送消息过程中,消息的ID会发生改变,由最初本地生成的一个UUID,变更为服务器端生成的全局唯一的ID,这个ID在所有使用Hyphenate SDK的 设备上都是唯一的。 应用需要实现此接口来监听消息变更状态

onMessageChanged 介绍:

void com.hyphenate.EMMessageListener.onMessageChanged   (EMMessage  message,Object change )     
接受消息发生改变的通知,包括消息ID的改变。消息是改变后的消息。
参数:
message 发生改变的消息
change  change, 包含改变的信息

于是将项目中change的Log删掉,项目愉快的跑了起来~

总结

当时脑残,就应该直接去看监听中为什么人家的好使我的不好使,删除其他代码后 找出不同与自己的代码,哪怕是输出的log。当然了 log是最后拍查的
我猜这次犯的错误就是因为有些变量 取了一次值之后 就被回收或者清除了
为什么我这么说呢,猜的啊~因为我也不知道为什么取了一次值之后就没有了,只能往这里联系了

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值