Retrofit情景分析

这篇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步先跳过的原因了。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值