TeamTalk Android代码分析(业务流程篇)
1.1 总体结构
1.总体结构有点类似MVC的感觉,模块结构从上向下大体是:
UI层:Activity和Fragment构成,期间包括常用的一些开源控件如:imageloader,speedx,gifview等,和下层数据变更通知通过总线事件完成(EventBus)
管理层:Service(即:imservice,下文均采用此称呼)和一些按照业务划分的Manager(loginmanager,contactmanager,sessionmanager,socketmanager 等),该层负责业务的流转和数据接口的提供,
数据和缓存层:才greendao实现,包括一系列业务相关的缓存,缓存的对象在各manager实体中处理。
网络层:具体由netty实现,获取或发送数据通过pb协议实现(protobuf)
2.1 登录过程
1>请求登录服务器(http),分配消息服务器及其他相关配置
2>链接请求消息服务器
3>其中如果网络连接失败,采用本地登录过程,即:在登录状态的情况下,没有网络也可以查看本地历史信息。
4>登录消息服务器成功后,发送总线事件通知imservice
5>imservice初始化各manager,开启本地和网络数据请求,本地缓存及其他配置的数据填充。
3.1 ContactManager的初始化操作
3.1.1 本地数据的业务操作
1>数据库load部门列表,并填充部门map(departmentmap)
2>数据库load用户列表,并填充用户map(usermap)
3>发送总线事件,通知相关界面(聊天/通讯录/my),并设置该manager数据状态就绪
相关页面动作如下:
1>聊天页面动作:只有session,user,group 数据全部就绪,这个页面才会更新,稍后再详细分析
2>通讯录页面动作:
(1)设置用户tab数据,更新ui
(2)设置部门tab数据,更新ui
(3)用户和部门数据就绪,搜索状态可操作
3>通过loginmanager获取登录信息,更新ui(这个位置的触发,可以放置在登录成功后及时事件通知)
3.1.2 网络数据的业务操作
1>按照本地存储的最后时间点作为参数,请求部门列表
2>按照本地存储的最后时间点作为参数,请求用户列表
3>获取部门数据:
1)缓存map
2)存储db
3)发送总线事件(userinfoevent事件,user_info_update),通知页面更新ui
涉及页面有:通讯录页面:用户列表ui/部门列表ui/用户详细信息(userinfofragment),如果页面收到通知,则获取缓存数据,更新ui
4>获取用户数据:
1)缓存usermap
2)存储db
3)发送总线事件更新ui,页面响应同部门数据。
注意事项:通知页面更新的总线事件,考虑采用poststicky 形式。
3.2 GroupManager的初始化操作