Rocky浅谈Retrofit

浅谈Retrofit

    • 前言
    • Retrofit
    • Retrofit的核心
      • Builder
      • Adapter
      • Factory
      • OkhttpCall
    • Retrofit原理
    • 自定义Retrofit
      • 定义call
      • 仿写OkhttpCall
      • 准备适配器
      • 默认回调
      • 其他回调
      • 自定义Retrofit
      • ServiceMethod
      • 调用

前言

在这次重新梳理设计模式是的时候突然的发现,开发android 这么久了一直在用retrofit,毫无疑问这是一个非常优秀的框架,相信作为手持端开发的你我几乎都在用。那么它的工作原理是什么?它的核心内容是神马?抱着这个疑问我试着‘点击’了源码。

Retrofit

相信大家也都知道它是一个网络求情框架。其实,可以在进一步讲,它是把okhttp二次封装的网络请求框架。
我们知道,okhttp已经是一个很好用的网络框架了,那么大牛们为什么还要再次封装它呢?哈哈 在这里 作为程序员的你我都心知肚明,能‘cv’的绝不会手写,能简写的绝不会复杂,因此retrofit它应运而生。

Retrofit的核心

Builder

我们知道,okhttp的初始化参数有一大堆,那么基于我们的本性一定会想办法让它变得更简单,那么聪明的大牛们就想到了Builder设计模式,把必须基本的参数都交给了builder,至于其他的特殊参数也可以用过builder设置进去。

Adapter

在和后台数据交互的时候一定会用到回调,在回调的时候我们想得到不同的数据类型,有些情景需要Stream,有的需要json等等总之不同场景我们需要返回的数据类型是不同的!但是最为一个优秀的框架一定会考虑到大部分情况,即使有部分想不到,也会留有‘接口’,只是这个‘接口’是框架规定好的规则,在规则之内,你的代码,你的需求就会被Retrofit采纳,进而得到你想要的。这个就是适配器(Adapter)

Factory

优秀的框架指定是高内聚低耦合。作为使用者来说,我们使用Retrofit就是调用他的方法,返回想要的数据就好,其它的我们不关心。作为设计者,Retrofit是一个入口,它是提供给开发者方法,但是它需要原材料,而相对原料而言Retrofit又是使用者,它不要关心原材料怎么来的,只是在它需要的时候材料可以得到保证即可。这时候工厂应运而生了

OkhttpCall

以上的内容可以说都是请求的准备工作,而他们的想要工作必须有个穿针引线者,这时候真正的网络请求主角便登场了

Retrofit原理

这时候我们可以回到最初的疑问了。它是把okhttp需要的参数通过Builder准备好,然后执行想后台请求数据,后台通过OkhttpCall返回到前端,再通过工厂(Factory)创建CallAdapter,通过Adapter把后端返回的okhttpCall适配成相应场景所需要的

自定义Retrofit

定义call

咱们直接从后端返回数据到前端接受后开始。首先咱们有个call的总接口 这个是网络请求最原生的call

//要适配的主角
public interface MyCall {
    void call(T a);
}

仿写OkhttpCall

public class OkhttpCall implements  MyCall {
    @Override
    public void call(T a) {
        System.out.println(" execute okhttp call");
    }
}

准备适配器


//适配器 
public interface CallAdapter {
     abstract class Factory{
        abstract CallAdapter get();
    }
    T adapt(MyCallcall);

}

这时候很多人就会问 不是准备适配器吗,这里的适配器怎么有一个工厂。是的你没看错,这里的工厂就是生产adapter的,它除此之外只提供了一个抽象的适配方法。这里就是我上文说的按照Retrofit规则,就可以得到适应场景的返回,这里的规则就是这个接口所规定的。

默认回调


public class DefaultCallAdapterFactory extends CallAdapter.Factory {


    @Override
    CallAdapter get() {
        return new CallAdapter>() {
            @Override
            public MyCall adapt(MyCall call) {
                System.out.println("come in default......");

                return new MyCall() {
                    @Override
                    public void call(Object a) {
                        System.out.println("execute default......");
                    }
                };
            }
        };
    }
}

其他回调

这里我们使用另一个优秀的框架RxJava ,网络请求接口RxJva 返回一个Obversable


public class RxCallAdapterFactory extends CallAdapter.Factory {

    @Override
    CallAdapter get() {
        return new CallAdapter>() {
            @Override
            public Observable adapt(MyCall call) {
                System.out.printf(" come in RxCallAdapter ....");

             return Observable.create(new ObservableOnSubscribe() {
                    @Override
                    public void subscribe(ObservableEmitter emitter) throws Exception {
                        System.out.printf("executeRxCallAdapter ....");
                    }
                });
            }
        };
    }
}


这里可看到,返回的不再是Call 而是Observable对象了。看到这里我想大家会想到在使用Retrofit的时候

Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(…)
.addConverterFactory(…)
.build();

当传入不同的factory对象时候就会得到不同的返回

自定义Retrofit

Retrofit我们也采用Builder设计模式
在这里我们只提供一个create方法对外开发
由于Retrofit、需要用到CallAdapter 由因为不能是直接new对象,这里我们需要有个Factory来获得
在这里我们不讨论动态代理,所以这部分内容直接跳过,于是有Retrofit的雏形,

public class MyRetrofit {


    private CallAdapter.Factory factory;

    public MyRetrofit(CallAdapter.Factory factory) {
        this.factory = factory;
    }

    public CallAdapter callAdapter() {
        return factory.get();
    }

    static class Builder {
       private CallAdapter.Factory factory;

        MyRetrofit build() {

            if (factory == null) {
                factory = new DefaultCallAdapterFactory();
            }
            return new MyRetrofit(factory);
        }
    }

    public  T create() {
	     OkhttpCall call=new OkhttpCall<>();
	     return callAdapter().adapt(call);
    }
}

到这里我们已经可以使用默认的回调了,但是还是没有扩展,不能自定义factory,于是有了

public class MyRetrofit {


    private CallAdapter.Factory factory;

    public MyRetrofit(CallAdapter.Factory factory) {
        this.factory = factory;
    }

    public CallAdapter callAdapter() {
        return factory.get();
    }

    static class Builder {
       private CallAdapter.Factory factory;
       //构建者 加入自定义的factory
	   Builder addCallAdapterFactory(CallAdapter.Factory factory) {
            this.factory = factory;
            return this;
        }
        MyRetrofit build() {

            if (factory == null) {
                factory = new DefaultCallAdapterFactory();
            }
            return new MyRetrofit(factory);
        }
    }

    public  T create() {
	     OkhttpCall call=new OkhttpCall<>();
	     return callAdapter().adapt(call);
    }
}

到这里可以说已经完成了内容,但是我们点源码发现 create retrurn的时候不是直接适配的而是有一个ServiceMethod,那么我们就在稍微看一个这个类

ServiceMethod

其实我们点进去一看大致就会明白,它是把retrofit和callAdapter 解耦了,我们也仿照稍微改动一下,定一个ServiceMethod 同样适用构建者模式


public class ServiceMethod {


    private final CallAdapter callAdapter;

    public ServiceMethod(Builder builder) {
        callAdapter = builder.callAdapter;
    }

    public  T adapt(OkhttpCall call) {
        return (T) callAdapter.adapt(call);
    }

    public static class Builder {

        private final MyRetrofit retrofit;
        private CallAdapter callAdapter;

        public Builder(MyRetrofit retrofit) {
            this.retrofit = retrofit;
        }

        public ServiceMethod build() {
            callAdapter = (CallAdapter) retrofit.callAdapter();
            return new ServiceMethod(this);
        }
    }
}

最后的Retrofit就成了


public class MyRetrofit {


    private CallAdapter.Factory factory;

    public MyRetrofit(CallAdapter.Factory factory) {
        this.factory = factory;
    }

    public CallAdapter callAdapter() {
        return factory.get();
    }

    static class Builder {
        private CallAdapter.Factory factory;

        Builder addCallAdapterFactory(CallAdapter.Factory factory) {
            this.factory = factory;
            return this;
        }

        MyRetrofit build() {

            if (factory == null) {
                factory = new DefaultCallAdapterFactory();
            }
            return new MyRetrofit(factory);
        }
    }

    public  T create() {
        OkhttpCall call=new OkhttpCall<>();
        ServiceMethod  serviceMethod = new ServiceMethod.Builder(this).build();
        return (T) serviceMethod.adapt(call);
    }
}

调用

   MyRetrofit retrofit =new MyRetrofit.Builder()
            .addCallAdapterFactory(new RxCallAdapterFactory())
            .build();
    retrofit.create();

你可能感兴趣的:(架构师之旅)