老师,关于幕聊的最后完善,我有几个地方想请教。

来源:15-3 项目完善与展望-2

weixin_慕尼黑8068974

2020-08-04

老师,目前我跟着您的课程已经做完了,现在正在完善您提出的一些待完善内容。
现在遇到几个困难

  • 1、是想做出下拉刷新聊天记录的效果。
    我的观察:我发现QQ或者微信的查询聊天记录时,进到聊天界面发现是显示20条(我没数),然后滚到顶部下拉刷新时,就加载了20条(还是估计)聊天记录。然后我退出再进入,发现还是固定显示最近的20条消息,下拉继续加载新的20条。我想本地存储的就是20条消息记录吧,每次下拉就去服务器加载20条聊天记录,加载回来后不保存到本地。或许是这样吧。于是我就打算也这样做。
    我的思路是:聊天界面下拉刷新时,设置一个查询pushHistory的服务器接口,请求服务器查询:我跟对方的pushHistory 20条并返回。如果是我跟一个人聊天的话,那么这个pushHistory查询的关键词就是我跟他的Id就行。

    可是如果是群聊天记录呢?一开始我发现群的聊天记录其实也只是一个个人与人的聊天记录,并没有群id这个关键字,也就不能分辨我跟人的聊天记录还是作为群的聊天记录。所以在查询群消息记录时我打算给pushHistory添加一个groupId的字段,如果是单聊则不设置这个字段,如果是群聊,那么就给每个pushHistory都设置这个字段。
    可是我发现还有一个问题,那就是,如果查询群消息记录的话,假如群成员20个人,一条消息的消息记录就有20条,那么我想查询20条群的历史记录,回来的其实是20条重复的消息。
    老师就在我提问的过程中我想到一个办法,就是根据我添加的groupId字段查找到这个群的所有聊天记录,然后再查找我是接收者,这样就把聊天记录去重了,但是我作为发送者发给这个群的消息就查不到了(这一点好像是因为给群发送消息时,将消息发送给排除自己的群成员导致的),所以我打算将我发送的消息的pushHistory以我是接收者的身份也保存一份,但是不进行自我推送这条消息。
    这样就去服务器搜索groupId和我是接收者的pushHistory,将这些pushHistory的entity转换为MessageCard返回给我自己,我再将这些MessageCard插入到单人(群)的聊天RecyclerView的顶部,但不进行本地消息保存,然后局部刷新顶部就完成了查询聊天记录的功能。

  • 2、关于不在线时,有人给我发送消息,我上线后如何接收?
    根据您对这个问题的讲解。我打算使用登录后服务器查询pushHistory的接收情况,然后将没有接收到的消息再次推送给我 的这个方法进行操作。
    首先pushHistory的arrivalAt字段没有使用,我不知道我使用的对不对。每次个推submit()后会返回一个bool值,是表示消息推送成功或者失败。每次消息发送成功后,我都将再次保存pushHistory,并设置arrivalAt为当前时间。如果消息发送失败(此处是否是因为不在线才会失败?)则arrivalAt为空。
    每次登陆然后绑定pushId,在服务器返回绑定成功之前去查找我作为接收者并且arrivalAt为空的pushHistory,然后重新推送给我,这些操作完成后最后返回给客户端绑定设备Id成功(这样请求时间会不会过长?),最终进入到主界面。

  • 3、客户端显示未读消息在session界面中。
    看到QQ有个红色未读拖拽小球很有意思,根据您之前教的贝塞尔粘性效果,再查找了一些资料后,做出了差不多的控件。但是关于未读消息数量的获取,我发现session的private int unReadCount字段没有使用。我想了想,使用方式可不可以这样:当不在目标聊天界面时,每次接收到一条消息,存储这条消息到数据库并通知给对应的观察者,其中就包括目标session,然后目标session的unReadCount就进行+1操作。session列表显示session时根据unReadCount数量设置未读数量。进入到目标聊天界面直到从聊天界面退出之后,再次保存session并将unReadCount清零。

以上是我对这几个问题的思路,但不知道我的想法是不是过于繁琐,在实际应用中是不是有更加高效的实现策略?
(因为在想这些问题的时候没有什么思路,就打算问老师,可打字的过程中有了点思路,但还是想问老师的解决方案。)

写回答

2回答

Qiujuer

2020-08-07

  1. 历史消息问题:QQ、微信其实本地缓存了不止20条记录,他们的策略是:

    1. 本地含有最近20条展示在列表

    2. 加载历史消息时先从本地查找,本地没有从网络拉

    3. 网络拉的数据显示列表同时进行数据库缓存

    4. 这样本地的数据库缓存就会越开越多,达到一定值就进行清理操作

    5. 查询历史消息不是使用pushHistory表,而应该使用message表,根据当前的群id以及时间字段是可以查询到当前数据之前的数据的

  2. 在线提醒这个:

    1. 新增一个标记在线的接口,该接口客户端每隔5分钟调用一次,在User表中新增一个最后在线时间,每次调用将时间变更

    2. 拉取联系人接口与拉取个人信息接口新增检测最后在线时间,如果最后在线时间处于6(具体可根据上述的5分钟稍稍递增一些)分钟以内就标记为在线状态

    3. 每隔一段时间进行一次联系人刷新,如果觉得联系人太重,可以新增一个接口查询当前所有联系人的在线状态,该接口仅仅返回userid以及在线状态。

  3. 未读消息的思路差不多是正确的

0
6
weixin_慕尼黑8068974
回复
Qiujuer
十分感谢老师,这里都弄懂了^_^
2020-08-10
共6条回复

sunxiangguo

2020-08-05

你好啊,我可以问一下你具体是如何学习这门课程的吗?谢谢啦~

0
5
sunxiangguo
回复
weixin_慕尼黑8068974
回复 weixin_慕尼黑8068974:哇谢谢大佬!私聊哈~
2020-08-10
共5条回复

手把手开发完整的即时通讯App 客户端+服务端+MVP架构

客户端+服务端+MVP架构+封装思想+主流框架

1751 学习 · 874 问题

查看课程