一. 基本使用
https://square.github.io/retrofit/#introduction
//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.7.2'
implementation 'com.squareup.retrofit2:converter-gson:2.7.2'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.7.2'
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.weater.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
IWeather story = retrofit.create(IWeather.class);
Call<ResponseBody> call = story.getWeather("202.202.33.33");
call.execute();
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
App应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数,之后由OkHttp完成后续的请求操作。在服务端返回数据之后,OkHttp将原始的结果交给Retrofit,Retrofit根据用户的需求对结果进行解析。
二. Call对象
问题:
Retrofit的Call对象是OKHttp的RealCall对象吗?跟着代码来看看。
-
通过动态代理类执行请求。执行invoke方法返回结果,
-
在HttpServiceMethod类中实现了invoke方法,HttpServiceMethod类的作用是将接口方法的调用调整为HTTP调用。可以看到,在代码中创建了OKHttpCall,最最后调用了CallAdapter类实现的adapt方法,这个方法的作用是返回一个委托给Call对象的实例。
-
在DefaultCallAdapterFactory类中,adapt方法的实现。
-
ExecutorCallbackCall类实现了Call接口,delegate对象是传过来的OkHttp中RealCall对象。我们知道,在OkHttp中调用异步返回数据后还是在子线程中,这里retrofit通过callbackExecutor将结果发送到了主线程中,在Android平台中用了Handler。
通过代码分析,Retrofit在默认情况下Call对象是DefaultCallAdapterFactory.ExecutorCallbackCall。
二. 动态代理
代理类在程序运行时创建的代理方式。
三. 设计模式
建造者模式
Retrofit对象通过Builder内部类来构建。
观察者模式
call对象是被观察者,Callback为观察者。
外观模式
定义:提供了一个统一接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
Retrofit类就应用了外观模式。
工厂模式
CallAdapter也应用了工厂模式。
策略模式
CallAdapter类中的adapt方法,产生具体的实现。
工厂模式强调的是生产不同的对象,策略模式强调的是不同对象策略方法的实现。
适配器模式
CallAdapter中的get方法,实现了切换线程的功能。
addCallAdapterFactory