第一次纪录东西,也没有特别的顺序,想到哪里就随手画了一下,后续会继续整理~

6.2消息页面动作流程

6.2.1 消息页面初始化的总体思路

1.页面数据的填充更新直接由页面主线程从本地数据库请求

2.数据库数据的填充由后台线程异步方式从网络请求

3.前台线程每次按照18条记录读取数据库数据,后台线程按照每次18*3从网络请求数据

4.后台线程数据的请求由主线程满足一定的条件后发送总线事件,在 oneventbackgroudthread 中处理,具体条件(或的关系)如下:

1>第一次请求

2>本地数据库没有加载到数据

3>请求次数是3的倍数(为了满足本地数据能够及时读取到)

5.后台异步线程读取网络信息有目前两个接口,分别是

1>CID_MSG_LIST_REQUEST_VALUE 即:传入一个最后的消息id(lastmsgid)和 请求的数量(msgcnt),从服务端请求数据

2>CID_MSG_GET_BY_MSG_ID_REQ_VALUE 即 传入需要请求的消息id列表,从服务端请求数据

目前使用方式:

[第一次]从数据库请求的[当屏消息列表(18条或少)],全部都是[本地发送失败]的消息时,采用第一种方式,传入一个很大的数字和请求数量,去服务端拉取数据,否则,按照最后一个成功消息的msgid 和 请求数量(18*3)作为条件,从本地数据库读取消息列表(beginid -> endid),然后,按照该列表和 msgid 与 msgid-18*3 的区间过滤出本地没有的msgid,进而按照第二种方式去服务端请求数据。(因为从服务端是按照消息倒序的形式拉取的)

6.向下拉动时传入当前页面的第一个消息实体(msgid最新的实体)和拉动次数(pulltimes)作为参数,从本地数据库读取新数据,数据获取成功后,拉动次数加1.

6.2.2 消息接收的逻辑说明

1>总体实质:接收到服务端的pb数据转换为greendao生成的实体类messageentity及其子类(按照展示形式和业务分为textMessage,imageMessage,audioMessage,mixMessage[图文混合],并且子类利用重写messageEntity的getContent 等字段获取方法),并且存储messageEntity消息到数据库,及时更新数据库和本地缓存sessionmap,然后发送接收消息的事件,通知ui线程重新读取数据并刷新界面,当然,更新session的过程,也同样伴随数据库和界面数据的更新。

2>messageEntity子类的差异主要在于按照业务和展现形式的分类,具体子类按照具体形式扩充字段,例如:imagemessage,需要扩充字段 path,url,loadstatus。在数据库存储时都会序列化为json,存储在content字段内,从数据库读取数据时再反序列为不同的消息对象,这个正是orm框架的优势所在。

3>需要知道的,目前语音消息是通过socket发送的,所以就直接存储了,图片发送的是一个url,在页面展示时,再去请求地址。

6.2.3 消息发送的逻辑说明

1>构建发送对象(TextMessage,ImageMessage,AudioMessage)

2>存储消息对象到数据库

3>更新或创建Session缓存及存储数据库,并发送事件通知,更新session相关ui

4>更新消息界面(文本消息直接更新了,其他复杂一些)

5>发送消息到服务器,并添加检测队列。

6>ack返回后的处理

(1)更新本地消息数据库

(2) 更新session相关(sessionmap 以及db)

(3)发送总线事件(messageevent),通知界面更新。

6.2.4 图片消息的发送过程

TeamTalk Android代码分析(业务流程篇)---消息发送和接收的整体逻辑说明的更多相关文章

  1. TeamTalk Android代码分析(业务流程篇)

    TeamTalk Android代码分析(业务流程篇) 1.1 总体结构 1.总体结构有点类似MVC的感觉,模块结构从上向下大体是: UI层:Activity和Fragment构成,期间包括常用的一些 ...

  2. RabbitMQ 简单的消息发送与接收

    RabbitMQ是建立在AMQP(Advanced Message Queuing Protocol,高级消息队列协议)基础上的,而AMQP是建立在TCP协议之上的. 因此,RabbitMQ是需要建立 ...

  3. 整合Spring Cloud Stream Binder与GCP Pubsub进行消息发送与接收

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 之前的文章<整合Spring Cloud Stream Binder与RabbitMQ进行消息发送与接收& ...

  4. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  5. DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM

    背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO.C-FIND.C-STORE.C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来实现的,原因只 ...

  6. Android socket 使用PrintWriter和BufferedReader发送和接收出现乱码问题解决

    项目中用到了Android和C++的通信.选择了用socket 发送字符的方式,一開始使用的代码是: socket=new Socket(); InetSocketAddress isa = new ...

  7. 整合Spring Cloud Stream Binder与RabbitMQ进行消息发送与接收

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 Spring Cloud Stream专门用于事件驱动的微服务系统,使用消息中间件来收发信息.使用Spring ...

  8. ansible代码分析第一篇--主文件—ansible分析

    2016年2月23日,学习,分析ansible代码 ansible是一种运维中使用的批量部署的工具,它本身是一种框架,具体的部署和架构分析,下面这篇文章讲的不错. http://os.51cto.co ...

  9. 私有析构函数 Android 代码分析

    有人说声明 Private Destructor, 这对象只能在 stack 上创建,不能在Heap上创建, 其实错了, 这样的程序编译都过不了. 那为何会有 Private Destructor, ...

随机推荐

  1. 0x54 树形DP

    树形DP我只知道千万别写森林转二叉树慢的要死 没有上司的舞会 水!裸! #include<cstdio> #include<cstring> #include<cstdl ...

  2. Linux - 环境变量与位置变量

    环境变量 [root@local ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 注:只有自己执行 ...

  3. 【转】ios蓝牙开发学习笔记(四)ios蓝牙应用的后台处理 -- 不错

    原文网址:http://dev.ailab.cn/article-1038-220511-1.html 默认情况下,当应用进入后台或挂起时,蓝牙任务是不执行的.但是,你可以把应用声明为支持蓝牙后台执行 ...

  4. DELPHI调试出现disconnected session的解决办法

    我在控制面板中,是禁用了UAC的,如下图 但是,在注册表中启用了UAC(EnableLUA), 工程中请求了管理员权限,如下图: 所以,整个权限请求混乱了. 解决办法,要么把注册表的LUA设置为0,要 ...

  5. JDBC+MYSQL初始学习

    JDBC+MYSQL初始学习 一.学习准备 Eclipse 开发工具  + mysql数据库+navicat 数据库连接工具 Mysql的数据库连接驱动jar包  + testing测试集成+mave ...

  6. linux中errno使用(转)

    当linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招解决了不少 ...

  7. 优动漫PAINT(clip studio paint)怎么画一幅水墨竹子图

    今天小编分享使用优动漫PAINT绘制一个水墨竹子教程,绘画的过程中我只用到了两个笔刷,即钢笔模式下的“美术字”和“效果线专用”,并且全程鼠标绘制哦,所以生疏的笔触效果大家见谅,没有数位板的小伙伴不妨试 ...

  8. vc++绘图,颜色

    新建mfc应用程序,Graphic ,单文档 添加菜单项,点,直线,矩形,椭圆 建立类导向 MFC ClassWizard,为菜单项添加命令响应 添加成员变量 在CGraphicView构造函数中进行 ...

  9. jmeter的组成

    1.jmeter的组成 线程组:控制多线程并发 断言:预期是否与实际结果一致,性能测试经验不建议做断言 定时器:自已操作线程停顿的时间 监听器:调试自已的脚本和对系统的监控 配置原件:配置的插件 后置 ...

  10. POJ 1811 Prime Test( Pollard-rho整数分解经典题 )

    链接:传送门 题意:输入 n ,判断 n 是否为素数,如果是合数输出 n 的最素因子 思路:Pollard-rho经典题 /************************************** ...