谈谈数据存储和网络通信|青训营笔记

134 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第3天.时隔一星期,我又回来了,又是一周,继续复盘一下本周的学习内容。 首先是数据存储和网络通信部分。我们平时和客户端打的每次交道都会产生大量的数据,同时客户端要和服务端进行网络通信才能处理这些这些数据,提供我们所需要的服务。 首先来讲讲网络通信,我们每天都在使用客户端满足我们的需求,和别人聊天,听音乐放送,看直播等等。那么这些数据是如何传输到我们面前呢?这就是网络通信。学习过计算机网络的同学应该都知道,目前计算机/通信系统之间互联的标准体系是OSI模型,主流协议簇是TCP/IP,数据通过网络传输到电脑上,手机上,我们的客户端如何去解析这些数据呢,需要通过一些开源框架来实现。 目前主流的网络请求开源框架有HttpUrlConnection,Volley,Retorfit和OkHttp等,这些框架互有优劣,如图所示: image.png 目前实际开发中用的最多的是OkHttp和Retrofit两种,其中OkHttp是对Socket的封装,有Request,Response,Call三种主要的类,分别用来处理不同的网络请求,内部的Dispatcher类体现了高效性,通过在内部维持一个线程池,对最大连接数,host最大访问做了定义。这里需要引进一个连接池的概念,频繁的建立和断开Socket链接非常消耗时间和资源,HTTP中的Keeplive使一次TCP连接中可以持续发送多份数据而不会断开连接。因此连接的复用就变得重要起来了。OkHttp中的连接池通过构建双端队列存储链接,在ConnectInterceptor拦截器中查找是否有可用连接,有就复用,没有就新建。当连接池中的空闲连接超过5个或者keeplive时间超过5分钟,就清除链接。okHttp采用了责任链,建造者,工厂,观察者,单例等模式构建。 Retrofit是对OkHttp的再次封装,准确的说使一个Restful的HTTP网络请求框架的封装,他首先继承了OkHttp的全部优点。网络请求仍由OkHttp完成,Retrofit只负责请求的接口封装。服务端返回数据后,OkHttp将原始的结果交给Retrofit,Retrofit根据需求进行解析,Retrofit的使用也比较方便,首先引入相应的库,接着创建描述网络需求的库,然会使用Retrofit发送请求就可以了。Retrofit中要特别注意的是注解的使用。注解可以理解为一个标签,可以加在类,方法,成员变量,参数上,并可在合适的时候读取内容进行处理,比如@GET注解用于获取接口的相对路径,并采用GET方法发起请求。注解的处理时机有三种,1,只在源码中有效,编译时被抛弃,比如@override;2,编译class文件时有效,一般会用到注解处理器;3,运行时有效,运行期间获取注解并处理。注解的类型有很多,如图所示: image (26).png 通过这些注解的结合,我们可以实现更加丰富的功能。 最后呢,老师还介绍字节企业开发中用到的网络开源框架。企业中有不同的角色,框架的选择要兼顾不同同学的需求:研发希望用法稳定,最好是Retrofit;产品需要考虑用户的隐私,希望可以去掉敏感参数;技术TL希望便于监控性能,不同的需求结合在一起,形成了字节自有的网络框架TTNet,复用了Cronet网络库。 Cronet网络库用C++实现,相对于OkHttp做了不少优化如下图所示,请求成功率和延时方面有优势,但是不易使用,所以需要二次封装, image (27).png TTNet基于Retrofit二次开发,同时将OkHttp替换为CroNet。因此TTNet不仅继承了Retrofit的所有优点,还支持HTTP的多个网络库动态切换(OkHttp/Cronet),而且支持网络拦截配置添加公共参数,动态切花协议,HOST,动态选路等,甚至支持流解析等站未来的技术。 网络通信部分总结如图:

image (28).png 虽然现在的计算能力得到了大幅提升,但是数据的处理并不能瞬间完成,那么来不及处理的数据怎么办呢,就需要一定的存储技术,课程主要介绍了了安卓中常用的数据存储方式,主要方式及简述如图:

image.png 数据的存储也离不开数据库,Android中常见的数据库框架如下所示:

image.png 目前常见的存储方式是ROOM+SQLite.Room是谷歌JetPack家族的一员,在SQLite上提供了一层抽象,便于在利用SQLite强大功能的同时,流畅地访问数据库。主要有三个对象组成:数据库类(database),用于保存数据库并作为应用持久性数据底层连接的访问点;数据对象(Entity),表示应用的数据库的表;数据访问对象(DAO),提供用于查找,删除,插入,修改的方法。 Room的核心是在编译期通过kapt处理@dao,@database注解,动态生成相应的类,底层通过Android提供的supportSqliteOpenHelper实现数据的增删改查基本操作。 数据通信的总结如图:

image (29).png