Android 基于TCP的通信流程设计(金融行情)

笔者最近在重构一个基于mina通信的APP,之前全部采用同步的方式获取数据,这使得用户体验非常的糟糕(因为之前版本开发的人员,要么是刚入门,要么是半路出家,做服务器的,做web的.当然对android特性机制当然不是很明白.),所以boss安排我进行重构设计,从而提升前端的用户体验.当然,提升用户体验的方法有很多,但数据是前端良好体验的基础,所以我们第一步先从通信流程着手,不多说,直接上图.

  • Activity:试图层,当然不只是Activity,还可以是Fragment
  • Control:控制层,处理业务逻辑
  • ServiceApiManager:对通信服务的Api调用,还负责了最最核心的线程调度功能,全局也只有一个Handler,它可以将子线程的数据调度到主线程中.过滤器:对回包数据的组装和过滤
  • Service:它运行在一个独立的进程中,使用的AIDL通信.虽然有点麻烦,但是它是独立的.服务挂了并不会影响可视层.它对通信层做了接口调用
  • Communication:这里是基于Mina做的通信.Mina是一款非阻塞式的服务端框架(NIO),它支持TCP,UDP等协议通信,不熟悉的朋友可以自信去官方查看介绍.这里是协议的具体实现.包括发包,回包处理,粘包,多包暂存,丢包等处理.是非常核心的一个模块

这张图的结构并不是非常复杂.但是确实很实用,已经稳定的在线网上面跑了起来:)

因为所有操作都是异步的,一层驱动一层,返回结果什么时候返回不可控.那么我们在每一层中都定义了一个Callback接口,负责数据的回调传递,我们的做法是在每一层的基类中开放一个regCallback(Callback callback)的接口,当Activity 执行onResume()的时候进行注册回调接口,当而每一层的regCallback又会对下一层进行回调接口注册.一连串的事件基于onResume();当然onPause()时自然也是要disable掉回调接口,因为当Activity不可见的时候,其实是不需要执行什么操作的.当然不仅仅是disable这么简单.我们还做了一个result queue来收集在disable状态时返回的数据.当activity再次进入的onResume()的时候,不检查result queue是否为空,如果不为空,做出响应的逻辑即可.这里会有一个问题,因为contrl层设计的时候约定必须是单例的.而regCallback只能注册一个回调接口,就会导致一个control只能被一个使用者所使用,为了解决这个问题,我们在regCallback中的实现采用Map<key,value>的方式在存储每一个回调接口.这样就解决了此问题.

ServiceApiManager是如何把回包调度到具体Control的呢?Control对ServiceApiManager发起具体协议接口调用的时候还会附加一个回调接口(seq,callback).当Manager接收到回包的时候会得到回包中的seq,seq是什么?接下去看就知道了,再到Map中去查询Key为此seq的Callback进行回调,而Control想得到结果只需要case 本Control支持的协议 进行具体的业务处理.那ServiceApiManager又是如何处理回包数据呢?Service这一层暴露出来的每个协议接口返回都是int类型的 每个返回值都不会一样 而且是自动累加的一个seq.它是由另一个计数模块生成出来的.Client会把seq和协议号发送到服务端.服务端处理完之后会原封不动的返回给Client(简单对话模式),这样就解决了数据不知道到回到哪个地方的问题,Client只需要维护这个seqs即可.Service只需要把协议号,seq,回包内容返回给ServiceApiManager即可,Manager根据seq找出具体的Callback 这样就可以准确无误的告诉某个Control了,而Control知道了协议号, swich case即可处理具体的业务逻辑了.

这样每层可以负责自己对应的职责,松耦,Activity不需要对应的Handler 去更新UI了.试图层看起来非常简洁,Control层不会有Context的存在,不会对UI逻辑进行处理,只针对于业务,而数据组装过滤ServiceApiManager帮我们做了.所有耗时的数据处理都在子线程中进行再调度到Control中(主线程),这样视图层会非常流畅.用户体验会很好.每一层职责单一.不会过于复杂,过于复杂也不是一个好事,别人很难进行维护.通信服务和通信层完全独立在另外一个进程中.生命周期不会直接影响到用户可视这一层.服务挂了 监听一下重启即可。

这是很简要的介绍,大致的思路就是这样.有什么不足,希望大家一起交流:)

本文章属于原创,转载请注明出处.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值