大家都知道,从本质上来说app实际只是整个大系统当中的View层,因为设计优秀的系统中,app基本都不会承担任何实际的业务逻辑处理,只是负责向用户展示数据以及从用户端搜集用户数据。而这个数据的一来一去,自然离不开网络通信协议,而我们用得最多的,自然是这个http协议。目前优秀的第三方http框架有很多,例如volley,okHttp等,但是从我目前给一些开发者面试的结果来看,很多安卓开发者对http协议几乎一无所知,更不要说去深入理解一个http框架是如何构建的,虽然你会觉得这并不影响你完成你的工作,但如果你是一个有追求真正对技术感兴趣的开发者,只做api的搬运工我相信不是你的理想。所以自己花了将近一个月的业余时间,去深入学习http协议的一些核心内容,并设计编写这样一个底层框架,因为框架内容较多,这里大致会分成两到三篇来完成,希望对各位有所帮助。
今天第一篇我们先不写代码,先来分析一下http框架,大概要完成哪些工作。
一、我看过不少公司的代码,http协议的url信息都是在代码里写死的,这样做有什么坏处我想也不必赘述了。所以我们的第一个目标,就是实现url的动态配置,让url的修改完全和代码无关,一个配置文件就全部搞定。
二、根据配置文件自动处理get和post参数的添加以及加密。这个是每个框架必定要实现的功能。很多面试者连get和post的区别都不知道的原因也基于此,因为框架把这个细节进行了封装,让调用者只关注拼装参数而无需在意参数是如何发送到服务器的。
三、可自行配置httpHeader。很多公司都需要在http头中加入自己的字段并修改一些内容,所以框架必须有httpheader的修改能力。
四、缓存和缓存时间处理。为了提升用户体验,很多场景下并不是每次都需要重新请求服务器获取数据的,我们可以把上一次缓存的数据拿出来直接展示给用户,当缓存过期之后才重新请求服务器。所以我们的框架中要集成一个缓存能力,并且可以对配置的缓存时间进行处理。这里我们选择的缓存方案就是把服务器返回的response字符串进行缓存。
五、线程池和安卓端异步请求的处理。手机资源有限众所周知,如果任由客户端随意新建线程执行http请求,最极端情况就是一堆线程由于阻塞耗尽系统资源,所以必须通过线程池来管理所有的http请求。另外一个问题就是安卓是不允许UI线程直接进行http请求这类耗时操作的,所以框架中要把这件事也完成,让这件事对调用者也直接透明,省的handler弄得到处都是。
六、response的动态解析。通过配置文件,我们可以把response需要解析成的实体类直接配置在文件中,在调用者拿到的时候直接就是想要的class。同时通过何种方式解析也可以配置,xml,String,JSON,只要用户配置了,框架可以自动获得解析器并进行解析,向上层返回实体类。
七、请求可以发出,也必然可以取消,在用户主动退出程序或者某个Activity时框架必须提供请求取消的能力,否则将导致内存溢出或请求返回时的程序崩溃。
八、Cookie和Session的处理,cookie和session在框架中如何处理,一般要根据实际的业务需求来确定,这次就不在我们框架的重点之中,但是其原理,大家还是应该深入了解的。
九、Mock能力,也就是桩。很多客户端开发者都会有过这种经历,自己写代码都驾轻就熟,但是一碰到联调就肝颤,经常加班的原因是白天服务器都在开发,客户端到了晚上才有接口可以联调。这样搞就太不专业了,所以客户端自己要有mock能力,无非是假数据而已,所以框架中要提供接口,让我们可以自己配置假数据包括超时来确认各种场景下客户端的数据展示是否正确,这样联调的时候,我们早就把各种场景都测试OK,剩下的,无非是确认服务器的返回数据是否正确而已,效率高高,拒绝加班。
十、框架对外的接口,提供配置能力,所有框架都必须要有的东西。
囧rz,其实我之前也没想到居然总结出这么多玩意儿来,不过基本就这些整出来的话,这个框架已经很完善了,好,下一篇开始把这些需求一个一个用代码来完成。