为了账号安全,请及时绑定邮箱和手机立即绑定

学习IM中的观察者模式,消息收发模型和同步方案的一些心得

标签:
Java Android iOS

闲暇之余,一直关注慕课网,在慕课网学习一些知识,偶然间看到了实战课程《带后台的IM即时通讯App 全程MVP手把手打造》,因为以前没有接触过IM这类型的app开发,而且没写过后台,在犹豫之中还是购买了课程。学习之余,还是要总结一下学到的知识,不能知其然不知其所以然,故此记录。

带后台的IM即时通讯App 全程MVP手把手打造

首先 数据库表的设计,这个是一个难点,要考虑到一对多,多对一的关系以及各个表之间的主外键关系,我的建议是自己画一个关系图,哪怕是在纸上用笔画都没关系,理清关系对于我们后续的开发事半功倍。

项目架构

接下来我们看客户端,当然这才是我们的重点,首先看看我们的项目结构
图片描述
对于项目结构的划分,我们要把界面,逻辑,还有公共部分分离开来,这样便于将来维护
整个项目采用MVP模式进行开发,将数据与ui分离,便于解耦,P层负责处理我们的逻辑 V层只是跟ui界面相关的
网络请求采用Retrofit2 + okhttp3
界面部分我就不在此详细展开了,个人感觉还是蛮漂亮的,也是遵循了Material Design风格,上两张图
图片描述图片描述

消息同步方案

说道消息同步,方案有很多,最常用的Socket,WebSocket,集成第三方推送等等,当然为了快速开发这里选用了第三方推送,但其本质也是Socket,只不过第三方帮我们封装了,流程如下:
app push messge-->my server -->第三方推送--> app

消息收发模型

那么问题来了,我们每次发送消息接收消息都要实时去更新我们的列表以及本地数据库,如果我们每次消息变更时都去刷新一遍整个列表,显然效率是很低的,如果数据量很大,可能造成界面卡顿,影响用户体验。这里我们就要用到观察者模式,直接看代码
图片描述
最后会将我们的消息分发下去,dispatch是接口中的一个方法,我们看看具体实现
图片描述
最后会将我们的消息存到数据库,之后会调用notify刷新界面
图片描述
那么我们被观察者又是怎么实现的呢?我们这里把所有的被观察者都看作是一个数据的仓库,我们不仅在消息界面需要更新,还有联系人,群聊,最近会话列表等等很多地方数据改变是都应该刷新界面,那么我们要定义一个BaseDbRepository ,这里涉及到很多泛型的使用,不同数据源会使用不同的数据对象,所以定义泛型是必要的,这也是封装的一种思想
图片描述
接下来我们拿消息举例子,其他数据同理,在调用notifyDataChange之后我们会调用onDataLoaded方法,而具体实现是在我们自己对应的Presenter中
图片描述
箭头处是我们使用android官方给出的RecyclerView的增量更新的工具类,发现有数据改变,我们只需要刷新改变的那部分,大大的提升了我们的效率,也给用户一个良好的体验

至此我们整个消息收发的模型就搭建完毕了,整个流程的熟悉,对于以后的功能扩展,以及遇到问题的处理都会变得很轻松,扩展部分我们接下来再讲。那么我们在这个观察者模式中学习到了什么,首先,我认为写代码不难,难的是思维,如果讲完还是很难理解这个流程,那么我建议你打断点调试,发一条消息,一个个断点打下去,看看流程是怎么走的,这中间的逻辑是怎么顺起来的也就一目了然。当然,好记性不如烂笔头,还是要把代码多打几次,这样才能把知识变成自己的。提醒大家,学习切勿急躁,一步一个脚印走,慢慢的你就会发现你离成功又近了一步!

对于项目的扩展

毕竟是教学项目,不可能面面俱到,app在功能上肯定不能像商业项目那么完善,那么做完学习,业余时间我也在此项目的基础上扩展了一些功能。

消息未读红点提示

这个红点样式我是仿QQ自己写的,也就是自定义View的应用,涉及到贝塞尔曲线,关于贝塞尔曲线的讲解慕课网也有教程,附上链接,我就不详细描述了,当然这中间也有很多坑,在我写好后发现只能在RecyclerView的Item中移动,超出去就看不到了,咨询了老师,给了很多意见,于是通过再画一个红点浮在最上面,拖动时隐藏原来那个,拖动浮层的原点,具体实现我会再单独写一篇文章来描述,敬请关注
自定义实现顶部粘性下拉刷新效果
我们主要看看逻辑的实现,在我们这样的架构下,增加此功能其实非常简单,经过我们前面的分析,只要每次消息变化时,我们都会通知界面区刷新会话
图片描述
那我们只需要在此方法中更新我们的未读数量就好,这里有一点要注意,我给别人发的消息是不增加未读消息的,最后我们还要在进入聊天界面时,将此会话的未读消息数清零即可,就不演示代码了,相信大家都会的
图片描述

发送红包

这个功能我是集成了云账户SDK,关于配置官网很详细,我就不一一介绍了

云账户SDK Android文档

先上图,手机拍的,见谅
图片描述
还是那句话,一个项目架构写好,功能扩展真的so easy 我们写好两个布局,一左一右,然后我们只需要在Message中加一个红包类型,相应的服务器Message中也加入同样的类型,之后将红包信息封装到Message的attach属性中就好,这样我们红包消息可以直接当做普通消息一样收发,至于拆红包,绑定支付宝,我们交给第三方就可以,下面是封装的红包工具类,主要是收发红包
图片描述图片描述

后记

如果需要将服务器部到公网,请参考服务器外网部署计划
当然,我们还有很多功能没有实现,后续也打算再加入一些功能,比如消息撤回,消息发送状态,视频,黑名单等功能,但显而易见,掌握了这个项目架构,以及项目的整体流程,添加自己想要的功能非常的容易,在此也感谢慕课网提供给我们这样一个学习的平台,感谢qiujuer老师耐心的指导(真的很负责),在这里祝愿在慕课网学习的同学们都可以成长为技术大牛,加油!

点击查看更多内容
16人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消