发布网友
共1个回答
热心网友
Retrofit是什么
贴一个Retrofit官网文档链接 square.github.io/retrof...,下面这句话是官方对retrofit的一句话介绍:
A type-safe HTTP Client for Android and Java
翻译一下就是:为Android和Java提供的一个类型安全的HTTP客户端。
还有一个大家熟知的HTTP框架是OkHttp,其实Retrofit是对OkHttp的封装,让我们使用起来更方便,底层网络通信的实现还是通过OkHttp实现的。这里再多提一句,其实在Android4.x的时候HttpURLConnection的源码实现就已经替换成了OkHttp。
Retrofit怎么用
创建一个interface作为请求集合,用注解的方式写上自己所需的请求方法。
使用Retrofit实例化定义好的interface
调用实例对应的请求方法,创建出Call对象,然后使用enqueue方法发起网络请求
到这里,一次简单的使用Retrofit进行的网络请求就实现了。
源码结构
网络请求最终的调用是使用enqueue方法,然而Retrofit的核心方法是retrofit.create()方法。create方法传入我们创建的interface实例,第一步调用validateServiceInterface(service)方法
根据函数命名可以猜测这个方法是为了验证传入的service的有效性。首先判断它是不是一个接口,接下来把service放到一个双向队列里面,做candidate.getTypeParameters().length != 0的判断,就是service不能是一个泛型的接口。Collections.addAll(check,candidate.getInterfaces()),把service的父接口也都加到队列里面做验证。
接下来if (validateEagerly){} 代码块就是对service接口里定义的方法做验证,对每一个方法调用loadServiceMethod(method)来做初始化,并对方法做了缓存。在初始化过程中验证了方法写的有没有问题。
再回到create方法,接下来这么多行代码其实就是调用了Proxy.newProxyInstance(),来实现代理。这个方法里面,最后一个参数是创建了InvocationHandler(),当我们在外部调用service的具体方法的时候(我们例子中的listRepos方法),实际是调用了InvocationHandler的invoke()方法。
在我们这个例子里面,proxy是handler本身,method是listRepos方法,args是user。
那么我们就来看一下invoke里面的方法。这里面的核心还是最后一行代码。
loadServiceMethod方法是对method对象做解析,也就是parseAnnotations,并把结果放到缓存中,保证只做一次解析。
然后我们跟到ServiceMethod的parseAnnotations方法里面,这里有个RequestFactory,因为我们的service接口里面的方法是使用注解写的,这里其实就是对函数的这些注解进行解析。这里就不详细展开讲这个解析了。我们直接跳到HttpServiceMethod的parseAnnotations()方法,返回的是CallAdapted对象。
我们找到CallAdapted类,可以发现是继承HttpServiceMethod的,那么我们就可以在HttpServiceMethod里面找到invoke()方法。invoke()方法里面先创建了一个OkHttpCall的对象。
OkHttpCall类实现了Retrofit的Call接口的方法,然后利⽤ RequestFactory 和 OkHttpClient 来创建了⼀个 okHttp3.Call 对象,调⽨这个 okHttp3.Call 对象的enqueue()方法来进⾏⽹络请求的发起,最后⽤ ResponseConverter 对结果进⾏处理之后,交还给 Retrofit 的 Callback 。到这里,我们网络请求的整条路就走通了。
但是,我们可以看到invoke()里面最后返回的是adapt()方法,我们再回过头去看这个方法是干什么的。这是一个抽象方法,实现在CallAdapted类里面。继续看到callAdapter.adapt(call),又看到adapt是接口里面的一个方法,那么我们就去看callAdapter是什么时候创建出来的。
我们看到callAdapter是从Retrofit类里面的callAdapterFactories对象取出来的
callAdapterFactories又是哪里来的,我们到Retrofit的build()方法里可以看到以下代码
通过platform.defaultCallAdapterFactories(callbackExecutor)一直跟下去,我们找到了adapt的实现,最后得到的是一个ExecutorCallbackCall,那么ExecutorCallbackCall又是什么呢?
可以看到ExecutorCallbackCall也实现了Retrofit的Call接口,delegate就是我们之前生成的OkHttpCall的对象,那么我们这个例子中的repos.enqueue()其实就是调用了下面这个ExecutorCallbackCall的enqueue()方法,然后再调用delegate.enqueue(),也就是OkHttpCall的enqueue()方法。那为什么要套一层ExecutorCallbackCall呢?我们来看看下面这个onResponse()方法做了什么事情,那就是callbackExecutor.execute(),那我们就来看看callbackExecutor是什么。
又回到Retrofit的build方法,发现callbackExecutor是通过platform.defaultCallbackExecutor()得到的
然后就是下面这个代码,我们发现这个实际作用就是切回到主线程,所以套一层ExecutorCallbackCall的作用就是把网络请求的后台线程切回到主线程。
到这里,Retrofit的的源码阅读就结束了,下次我们来看看OkHttp的源码。
热心网友
Retrofit是什么
贴一个Retrofit官网文档链接 square.github.io/retrof...,下面这句话是官方对retrofit的一句话介绍:
A type-safe HTTP Client for Android and Java
翻译一下就是:为Android和Java提供的一个类型安全的HTTP客户端。
还有一个大家熟知的HTTP框架是OkHttp,其实Retrofit是对OkHttp的封装,让我们使用起来更方便,底层网络通信的实现还是通过OkHttp实现的。这里再多提一句,其实在Android4.x的时候HttpURLConnection的源码实现就已经替换成了OkHttp。
Retrofit怎么用
创建一个interface作为请求集合,用注解的方式写上自己所需的请求方法。
使用Retrofit实例化定义好的interface
调用实例对应的请求方法,创建出Call对象,然后使用enqueue方法发起网络请求
到这里,一次简单的使用Retrofit进行的网络请求就实现了。
源码结构
网络请求最终的调用是使用enqueue方法,然而Retrofit的核心方法是retrofit.create()方法。create方法传入我们创建的interface实例,第一步调用validateServiceInterface(service)方法
根据函数命名可以猜测这个方法是为了验证传入的service的有效性。首先判断它是不是一个接口,接下来把service放到一个双向队列里面,做candidate.getTypeParameters().length != 0的判断,就是service不能是一个泛型的接口。Collections.addAll(check,candidate.getInterfaces()),把service的父接口也都加到队列里面做验证。
接下来if (validateEagerly){} 代码块就是对service接口里定义的方法做验证,对每一个方法调用loadServiceMethod(method)来做初始化,并对方法做了缓存。在初始化过程中验证了方法写的有没有问题。
再回到create方法,接下来这么多行代码其实就是调用了Proxy.newProxyInstance(),来实现代理。这个方法里面,最后一个参数是创建了InvocationHandler(),当我们在外部调用service的具体方法的时候(我们例子中的listRepos方法),实际是调用了InvocationHandler的invoke()方法。
在我们这个例子里面,proxy是handler本身,method是listRepos方法,args是user。
那么我们就来看一下invoke里面的方法。这里面的核心还是最后一行代码。
loadServiceMethod方法是对method对象做解析,也就是parseAnnotations,并把结果放到缓存中,保证只做一次解析。
然后我们跟到ServiceMethod的parseAnnotations方法里面,这里有个RequestFactory,因为我们的service接口里面的方法是使用注解写的,这里其实就是对函数的这些注解进行解析。这里就不详细展开讲这个解析了。我们直接跳到HttpServiceMethod的parseAnnotations()方法,返回的是CallAdapted对象。
我们找到CallAdapted类,可以发现是继承HttpServiceMethod的,那么我们就可以在HttpServiceMethod里面找到invoke()方法。invoke()方法里面先创建了一个OkHttpCall的对象。
OkHttpCall类实现了Retrofit的Call接口的方法,然后利⽤ RequestFactory 和 OkHttpClient 来创建了⼀个 okHttp3.Call 对象,调⽨这个 okHttp3.Call 对象的enqueue()方法来进⾏⽹络请求的发起,最后⽤ ResponseConverter 对结果进⾏处理之后,交还给 Retrofit 的 Callback 。到这里,我们网络请求的整条路就走通了。
但是,我们可以看到invoke()里面最后返回的是adapt()方法,我们再回过头去看这个方法是干什么的。这是一个抽象方法,实现在CallAdapted类里面。继续看到callAdapter.adapt(call),又看到adapt是接口里面的一个方法,那么我们就去看callAdapter是什么时候创建出来的。
我们看到callAdapter是从Retrofit类里面的callAdapterFactories对象取出来的
callAdapterFactories又是哪里来的,我们到Retrofit的build()方法里可以看到以下代码
通过platform.defaultCallAdapterFactories(callbackExecutor)一直跟下去,我们找到了adapt的实现,最后得到的是一个ExecutorCallbackCall,那么ExecutorCallbackCall又是什么呢?
可以看到ExecutorCallbackCall也实现了Retrofit的Call接口,delegate就是我们之前生成的OkHttpCall的对象,那么我们这个例子中的repos.enqueue()其实就是调用了下面这个ExecutorCallbackCall的enqueue()方法,然后再调用delegate.enqueue(),也就是OkHttpCall的enqueue()方法。那为什么要套一层ExecutorCallbackCall呢?我们来看看下面这个onResponse()方法做了什么事情,那就是callbackExecutor.execute(),那我们就来看看callbackExecutor是什么。
又回到Retrofit的build方法,发现callbackExecutor是通过platform.defaultCallbackExecutor()得到的
然后就是下面这个代码,我们发现这个实际作用就是切回到主线程,所以套一层ExecutorCallbackCall的作用就是把网络请求的后台线程切回到主线程。
到这里,Retrofit的的源码阅读就结束了,下次我们来看看OkHttp的源码。