请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,视频里面这里代码有些疑问

图片描述
老师,还有一种场景:在与测试号聊天页面收到测试号消息时,如果不回,那么收到的最新的消息就不会被置为已读状态,此时unreadCount一直等于1,按理说会执行else语句,但是因为是在聊天页面执行,不是在含有tabBar的消息页面,所以不会执行小程序提供的API,即不会执行else语句。随即就会抛出异常,去执行第33行的代码,若按视频中第33行代码,则unreadCount还是等于1,那么当返回含有tabBar的消息页面时,就会执行if语句了,就造成了tabBar有显示未读消息1,但是会话框没有未读消息标记。
然后我让抛出异常时将unreadCount设置为0,直接返回含有tabBar的消息页面时就会执行else语句,这样就解决了上述问题。
我查看了下,SDK的setMessageRead这个方法,它说只有在打开/切换会话时才会将未读消息设置为已读。然后在当前会话中收到消息,则不会将收到的最新消息设置为已读,不知道是不是bug还是我理解有问题…
(当然也可能是我之前代码有问题?但是,我试着打印调试了那些地方,也对照了一下源码,并没有发现什么问题。麻烦老师看看了)

正在回答 回答被采纳积分+3

1回答

沁尘 2022-03-25 13:08:17

我按我的理解说下这里面的几个情况,这块比较复杂,具体可以 QQ 和我联系。

  1. 在与测试号聊天页面收到测试号消息时,如果不回,那么收到的最新的消息就不会被置为已读状态

答:假设你和测试号 A 在聊天,你在会话窗口看到了发来的消息,这时候你即便不回也是会被设置为已读,因为在我们课程的实现里面,主动拉取或者接收到当前会话的消息,都会调用一次 setMessageRead。已读不回的话,是不会触发_handleConversationListUpdate这个方法的,那么自然就不存在会出现unreadCount一直等于1的情况。

2. 我查看了下,SDK的setMessageRead这个方法,它说只有在打开/切换会话时才会将未读消息设置为已读。然后在当前会话中收到消息,则不会将收到的最新消息设置为已读,不知道是不是bug还是我理解有问题…

答:这个理解有偏差。。setMessageRead方法就是对消息标记已读,没有任何调用限制,实际上SDK也根本不可能知道你在什么情况下调用的。只要你对某个会话 ID 调用了这个方法,那这里面的消息就都会变成已读。文档中的意思是建议你在每一次打开或者切换会话的时候去调用这个方法来标记已读,这个建议是没啥毛病的,正常行为也是如此。在我们课程中均落实了这一机制,即“只要你在会话里看到了这消息,那就是已读了”

所以,根据目前了解的情况,我觉得是在设置已读这里没有按预期把某个会话里的消息设置已读,已读设置这里出错的话,后续_handleConversationListUpdate方法里计算未读数的时候就会有偏差。另外,缓存里面unreadCount这个值的更新计算是靠_handleConversationListUpdate方法的,如果这个值有错误,还有一个可能就是少触发了或者多触发了,具体可以打印下日志,观察下调用过程排查问题。

0 回复 有任何疑惑可以回复我~
  • 提问者 BroBBB #1
    排查了,发现_handleConversationListUpdate比_handleMessageReceived先执行了,还没将消息设置为已读就将unreadCount存到缓存里边了
    回复 有任何疑惑可以回复我~ 2022-03-25 17:16:58
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信