组件化封装思想实战Android App总结二App公共模块之网络请求组件一

241 篇文章 5 订阅

 网络请求学习目标:

 

在项目中创建一个sdk的module,然后

开发步骤:

一、利用okhttp提供的api去发送最基本的请求

 

创建一个OkHttpClient,创建一个Request,通过OkHttpClient将request发送出去,然后在onFailure()和onResponse()回调中进行处理。这样就可以通过OkHttp发送一个最简单的网络请求了。但是在实际开发中,是不会这样使用的。首先,只发送一个请求,就创建了这么多行代码,很冗余。发一个请求,创建一个OkHttpClient,创建一个Request,创建一个Call,创建一个Callback(),而这仅仅是一个最简单的get请求,如果是post()请求,如果是文件下载,则更加麻烦,这是第一点,代码冗余,几乎不可复用。第二点是,如果不使用okhttp而使用其它的网络请求框架,则每个使用该网络请求的地方都需要修改。第三点是,高级程序员受不了如此冗余的代码,肯定要对其进行封装,而且网络请求逻辑完全暴露在activity里是不合理的。

 

二、网络请求组件---封装思路

 

 

三、基于okhttp封装我们的网络请求组件

okhttp这个包,这个包中我们分了这几个包,cookie包,exception包,https包,listener包,request包,response包,和一个CommonOkHttpClient。从封装完的整个包结构可以看出支持cookie、支持exception、支持https等等。

 

 

1、RequestParams

作用是封装所有的请求参数到HashMap中

 

 

创建线程安全的hashmap,并通过put方法,将key和value保存到数据结构中去

注:在实际开发中,无论是新建类还是新建接口,一定要把类或接口的方法或者作用和作者写上

 

 

2、CommonRequest

作用是接收请求参数,为我们生成Request对象,该类类似于一个工具类。工具类只需要提供static方法即可

注:在写公共组件的时候,每个方法一定要加注释。因为自己写的,可能自己知道,但是别人必需得看懂代码才知道该方法是什么作用

 

创建post请求:

创建post Request需要三部曲:

①创建FormBody,然后向FormBody的构造体中添加参数

②添加完参数后,通过Formbody的构造体生成Formbody的对象

③然后通过Formbody生成Request对象

 

创建Get请求对象

 

直接就是字符串的拼接,将url和字符串拼接成一个字符串,通过字符串即可生成get类型的request

 

 

四、网络请求组件----Client封装

主要作用:请求的发送,请求参数的配置,https支持

 

1、进行配置

 

然后通过okhttpBuilder生成okhttpclient对象。到这里,okhttp的配置基本就完成了。

 

 

 

2、发送请求

在使用自己写的框架或者第三方框架时,在onCreate()中发送了一个请求,在请求还没有返回时就点了返回键或者activity直接被销毁了,大多数用户是没有再次处理这个请求的。但是在实际开发中,是需要处理这个请求的,因为每个request其实都是通过线程发送出去的,虽然界面已经被销毁了,但是最后请求如果会回来的话还是会回来。界面销毁了,用户看不见了,但其实它还是会占用一部分内存。所以,在返回Call对象以后,最终还是需要在onDestroy()方法中,调用call的cancel()方法取消我们这次请求,这样的话,就会提高我们页面的效率。

通过okhttpclient的newcall()方法创建一个call对象,然后调用call的enqueue()入队方法,将commCallback作为参数传进去,然后将callreturn回去。

这里用到了static关键字,会不会造成内存泄漏或者内存溢出?static关键字在正确使用的情况下,是不会造成任何内存泄漏或者内存溢出的。我们在使用Android源码或者第三方框架时,都是用static关键字进行修饰的。如果它会造成内存泄漏或者内存溢出的话,api早就造成很大的内存泄漏或者内存溢出的问题了。所以,在处理一些工具类的问题的时候,就可以使用static。

 

 

3、测试请求

只需要传入一个请求一个回调就可以了。但是callback中还需要处理很多东西,比如异常、数据解析、数据转发等

 

注:

通过以下两步设置Https的支持

 

 

 

getSslSocketFactory()这个方法是生成一个SSLSocketFactory。Https请求就是在http协议和tcp协议之间又加了一层SSL协议,就是这层加密协议。普通的http请求其实最后也是走的tcp请求,tcp请求需要建立一个socket连接,所以普通的http请求走的就是socketfactory获取到的普通的socket,而https请求获取到的就是SSLSocketFactory,这样就可以完成对SSL完成支持了。

 

 

X509就是https所使用到的一个协议。首先就是获取到一个Manager  X509TrustManager。这个信任管理器类默认都是空实现

 

可以通过创建的上下文初始化SSLContext。初始化sslContext的时候,需要与服务器保持一致。如果服务器端用的是SSL算法,那么获取实例时也需要使用SSL算法,如果服务端用的是TSL算法,那么客户端也需要使用TSL算法,否则数据会不正常。

获取sslContext后,就需要根据X509TrustManager和随机数初始化sslContext。初始化好以后就根据sslContext来返回一个sslsocketFactory()。从名字上来看,它其实就是一个sslsocket的一个工厂类,通过它底层可以获取到sslsocket

 

 

 

下面这个方法是获取指定证书的Factory

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值