Retrofit源码分析

一. 基本使用

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 call = story.getWeather("202.202.33.33");
        call.execute();
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
            }
            @Override
            public void onFailure(Call call, Throwable t) {
            }
        });
网络请求流程

App应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数,之后由OkHttp完成后续的请求操作。在服务端返回数据之后,OkHttp将原始的结果交给Retrofit,Retrofit根据用户的需求对结果进行解析。

二. Call对象

问题:
Retrofit的Call对象是OKHttp的RealCall对象吗?跟着代码来看看。

  1. 通过动态代理类执行请求。执行invoke方法返回结果,


  2. 在HttpServiceMethod类中实现了invoke方法,HttpServiceMethod类的作用是将接口方法的调用调整为HTTP调用。可以看到,在代码中创建了OKHttpCall,最最后调用了CallAdapter类实现的adapt方法,这个方法的作用是返回一个委托给Call对象的实例。


  3. 在DefaultCallAdapterFactory类中,adapt方法的实现。


  4. 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

你可能感兴趣的:(Retrofit源码分析)