接上篇的 OkHttp 源码解析,目前项目中更多的用到的是 OkHttpUtils 和 OkHttp 所以有必要了解它的原理,以便遇到网络相关的问题时,可以及时的定位并解决问题,关于 OkHttp 源码相关的内容请看上篇, 请在阅读过上篇的基础上来看这篇会更好的理解,下面就开始吧。
本文的目录大致是这样:
- OkHttpUtils 简单使用
- OkHttpUtils 源码解析(V2.6.2)
- OkHttp 和OkHttp 的对比
OkHttpUtils 简单使用
首先要在 gradle 中加上
1 | compile 'com.zhy:okhttputils:2.6.2' |
将直接使用okhttp默认的配置生成OkhttpClient,如果你有任何配置,记得在Application中调用initClient方法进行设置。
1 | public class MyApplication extends Application |
在具体的使用过程中
GET 请求
1 | String url = "http://www.csdn.net/"; |
Post JSON
1 | OkHttpUtils |
能看出常用的GET ,POST 请求写起来非常简单流畅, 并且网络回调直接到主线程中了,可以直接处理数据。
OkHttpUtils 源码解析
我们通过这个get 请求,进去到源码中看下是如何封装的。
1 | OkHttpUtils.get().url("http://www.baidu.com").build().execute(new com.zhy.http.okhttp.callback.Callback() { |
OkHttpUtils
1 |
|
根据代码 能看出 OkHttpUtils 做了双重锁定的单例处理,因为一个App有一个 OkHttpClient 对象就行了。new 出了一个 OkHttpClient 。
我们在Application中初始化后,就生成这样一个对象, 以后每次用的时候就取得这个,无需重复创建。
实例化 OkHttpUtils 时 会创建 mPlatform = Platform.get() 。我们看下这是什么。
1 | private static final Platform PLATFORM = findPlatform(); |
此外在OkHttpUtils的构造方法中可以注意到有一个mPlatform的变量,他会根据当前是Android还是其他平台的不同被初始化为Android主线程或者普通线程池。
当是 Android 系统,new 了一个Android ,里面一个内部类,实现了 Executor, 创建了一个 handler 传入 Looper.getMainLooper() 主线程的 Looper,线程池执行时在这把可执行的 runnable 发送到主线程, 然后执行,就实现了线程切换。
它的功能就是实现线程之间的切换的。
1 | //GetRequest |
使用 get请求 new GetBuilder() 创建了一个继承 OkHttpRequest 的 GetRequest,配置需要的参数。
执行网络请求 execute
然后 看下 execute 的具体内容
1 | public void execute(Callback callback) |
1 |
|
来看看处理返回成功的回调方法
1 | public void sendSuccessResultCallback(final Object object, final Callback callback, final int id) |
是不是有点眼熟 mPlatform 其实就是上面的那个 Android , 把这个 runnable 发送到主线程。
在本文中,okhttputils将初始化OkHttpClient的动作提取出来,这样同一个应用只需要在最开始的时候配置一下诸如网络超时、cookie等既可。
在具体的实现中,通过OkHttpRequestBuilder收集网络请求的属性并传递给OkHttpRequest,在其子类中按照不同的需要实现生成Request的方法。
OkHttpRequestBuilder的build()方法会生成RequestCall对象,RequestCall对象的execute()方法会调用OkHttpRequestBuilder对象的generateRequest()方法产生Request,并据此产生Call对象,最后通过该Call对象的enqueue方法执行网络请求。
至此 OkHttpUtils 的源码分析完成了,其实代码相对简单,就是对 OkHttp 的一个封装, 少写了一些代码, 把常用的 get , post ,postString,postFile,head,put, delete 都进行了一个封装,调用起来非常方便。
并且网络请求的返回内容也回调到主线程,方便进行 UI 操作,
这也解决了上一个篇文章中说的 OkHttp 的两个缺点。