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

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

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 图片消息的发送过程

时间: 2024-11-03 22:50:18

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

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

TeamTalk Android代码分析(业务流程篇) 1.1 总体结构 1.总体结构有点类似MVC的感觉,模块结构从上向下大体是: UI层:Activity和Fragment构成,期间包括常用的一些开源控件如:imageloader,speedx,gifview等,和下层数据变更通知通过总线事件完成(EventBus) 管理层:Service(即:imservice,下文均采用此称呼)和一些按照业务划分的Manager(loginmanager,contactmanager,sessionma

Chromium的IPC消息发送、接收和分发机制分析

由于Chromium采用多进程架构,因此会涉及到进程间通信问题.通过前面一文的学习,我们知道Browser进程在启动Render进程的过程中会建立一个以UNIX Socket为基础的IPC通道.有了IPC通道之后,接下来Browser进程与Render进程就以消息的形式进行通信.我们将这种消息称为IPC消息,以区别于线程消息循环中的消息.本文就分析Chromium的IPC消息发送.接收和分发机制. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! Chrom

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

项目中用到了Android和C++的通信,选择了用socket 发送字符的方式,一开始使用的代码是: socket=new Socket(); InetSocketAddress isa = new InetSocketAddress(IP_STR, port); socket.connect(isa, 100); PrintWriter out=new PrintWriter(socket.getOutputStream(),true); BufferedReader recvBuf=new

Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程

Android核心分析 之一分析方法论探讨之设计意图 http://www.apkbus.com/android-24212-1-1.html Android核心分析 之二方法论探讨之概念空间篇 http://www.apkbus.com/android-24213-1-1.html Android是什么 之三手机之硬件形态 http://www.apkbus.com/android-24215-1-2.html Android核心分析之四手机的软件形态 http://www.apkbus.co

新版Android代码分析,生成的代码都有什么用?

刚开始学习,新手,欢迎拍砖和鄙视. 直接入题,新版Android的主要代码分析: 1 package com.bslk.helloworld; 2 /*1.这里的导入包,会有报警告的地方,因为没有使用,已干掉了,其他不管,现在应该0Err0Warn*/ /*2.这是一些导入的包,具体的不解释,不纠结,不懂自己度娘,问了我会鄙视你的*/ 3 import android.support.v7.app.ActionBarActivity; 4 import android.support.v4.ap

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

背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO.C-FIND.C-STORE.C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来实现的,原因只有一个:基于C#的fo-dicom库具有高封装性.对于初学者来说实现大多数的DIMSE-C.DIMSE-N服务几乎都是"傻瓜式"操作--构造C-XXX-RQ.N-XXX-RQ然后绑定相应的OnResponseReceived处理函数即可.本博文希望在前几篇预热的基础上,对比DCMTK.fo

windows消息发送与接收

Windows开发中一个重要的概念就是消息.能搞清楚消息的传递和处理,相信可以使我们对Windows程序有更深的理解. 先把消息划分为3类:发送消息(Incomingsent message).投递消息(Post message).输入消息(Input message).其中发送消息是非队列消息,而后两种是队列消息.在线程的消息队列中并不包括非队列消息,而只有队列消息才会在线程的消息队列中. 由上面的分类也可以知道为什么不能通过PostMessage函数来模拟输入动作.因为投递消息将进入到投递消

Bluemix结合RabbitMq实现消息发送与接收实例

什么是RabbitMq? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过 队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求. 什么是Bluemix? BlueMix 是 IBM 基于 Cloud Foundr

cocos2dx 消息发送与接收

     cocos2dx有个自定义事件可以实现消息的发送和接收,叫EventListenerCustom.它是通过一个字符串来标识事件名称的.下面介绍下,我实现的这个消息的发送和接收.      首先,我们定义2个类,一个消息接收类,一个消息发送类.代码如下:       //消息接收 class cMsgReceiver { public: virtual void RecMsg(int iMsgId, void* pInfo, int iSize) { } }; //消息发送 class