Retrofit情景分析

    xiaoxiao2025-06-09  23

    这篇blog主要是通过引导思路来了解Retrofit的工作流程,实际情况需要配合源码进行细节了解

    调用流程

    在使用Retrofit访问网络的时候,需要经过一下步骤:

    //1.声明接口 public interface DemoService { @GET("ActionServlet?action=login") Observable<Result<Login>> readBaidu(@Query("username") String username, @Query("password") String password); } //2.实例化retrofit retrofit = new Retrofit.Builder() .baseUrl("服务器地址") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); //3.创建服务 demoService = retrofit.create(DemoService.class); //4.获取数据 demoService.readBaidu("传入参数");

    情景分析

    通过retrofit获取service

    那么我们从哪里说起呢?就从第3步开始说起吧,从retrofit的create函数说起 (因为这一步作为切入点最能理解整个流程)

    public <T> T create(final Class<T> service) { //此处省略了无数代码 return Proxy.newProxyInstance(service,..); }

    create函数通过逆传进去的service,生成一个service的动态代理进行返回 动态代理 用最人性化的方式将就是代理人,从表面上看我是返回一个service给你,但其实当你调用service的时候,我会先偷偷做一些操作,然后再帮你调用这个方法,这就是简单一点的理解动态代理

    调用service的方法

    那么接下来,比如我们要获取百度的数据,通过service.getBaidu()方法。 根据上面的分析,我们其实就是调用代理的geibaidu()方法,在上面也说了,代理会在你调用之前偷偷地做一些见不得人的事,那么具体是什么呢?

    return loadMethodHandler(method).invoke(args);

    掌握动态代理的人应该都知道调用代理的方法其实就是InVocationHandler里面的invoke方法,那么如果你不了解也没关系,用人话说,就是你调用这个方法,我先把这个方法的一些信息解析一下,再去调用 那么怎么解析呢?就是通过MethodHandler这个类;

    MethodHandler

    有人可能会问,为什么不在代理类里面就直接调用方法,还要搞这么多莫名其妙的? 首先,你要思考一下,你在service里面只是声明了一个接口方法,还有一些注解信息,那么retrofit做什么呢?就是要解析这些注解,还有设置怎么访问网络,怎么解析网络返回的数据,这些retrofit不可能直接就在代理类里面做把?所以就有了MethodHandler这个类的存在了 看了上面这段话,我们也大概知道了MethodHandler主要做了什么事情把 MethodHandler最重要的四个属性:

    CallAdapter 决定网络请求的环境Converter 怎么解析数据结果以及解析数据用到的引擎RequestFactory 封装请求信息OkHttpCall 访问网络

    用了最“人”的话来解释这四个角色了!!信心的人会发现,前俩个参数正是我们实例化retrofit的时候传进去的,所以这也就是第1步和第2步先跳过的原因了。

    今晚没时间了,下次再补上各个模块解析

    转载请注明原文地址: https://ju.6miu.com/read-1299765.html
    最新回复(0)