老三长谈之Retrofit源码分析

老三长谈之Retrofit源码分析

用了Retrofit大半年了,源码看了好几次。今天我来总结一下吧,以后不看他的源码了。好记性不入烂笔头!!!

在没有开源框架的日子

我们先来看一下没有HTTP框架以前,我们是如何做请求的。

1.首先build request参数
2.因为不能在主线程请求HTTP,所以你得有个Executer或者线程
3.enqueue后,通过线程去run你的请求
4.得到服务器数据后,callback回调给你的上层。

大概是以上4大步骤,在没有框架的年代,想要做一次请求,是万分痛苦的,你需要自己管理线程切换,需要自己解析读取数据,解析数据成对象,切换回主线程,回调给上层。
这种刀耕火种的原始时代,我们就不要在项目的时候去使用了。效率太低了

现在市面上比较火的开源框架是Retrofit,让我们看看,学习一下他的源码.
首先先去下载他的源码吧
https://github.com/square/retrofit/tree/e6a7cd01657670807bed24f6f4ed56eb59c9c9ab

Retrofit大概流程图:

Retrofit的基本使用

 
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.build();

所有东西都是先看构造器的

1.通过Retrofit来build一个retrofit对象 使用的是建造者模式 为我们方便的建立一个复杂的对象

    public Builder() {
      this(Platform.get());
    }
  private static final Platform PLATFORM = findPlatform();

  static Platform get() {
    return PLATFORM;
  }

  private static Platform findPlatform() {
    try {
      Class.forName("android.os.Build");
      if (Build.VERSION.SDK_INT != 0) {
        return new Android();
      }
    } catch (ClassNotFoundException ignored) {
    }
    try {
      Class.forName("java.util.Optional");
      return new Java8();
    } catch (ClassNotFoundException ignored) {
    }
    return new Platform();
  }

 
static class Android extends Platform {
@Override public Executor defaultCallbackExecutor() {
//默认回调到主线程
return new MainThreadExecutor();
}
@Override CallAdapter.Factory defaultCallAdapterFactory(@Nullable Executor callbackExecutor) {
if (callbackExecutor == null) throw new AssertionError();
//这里默认设置ExecutorCallAdapter
return new ExecutorCallAdapterFactory(callbackExecutor);
}
static class MainThreadExecutor implements Executor {
//底层使用handler来进行跳转
private final Handler handler = new Handler(Looper.getMainLooper());
@Override public void execute(Runnable r) {
handler.post(r);
}
}
}

上面代码是对retrofit对象的分析

对于一个call的建立

IpService ipService = retrofit.create(IpService.class);

使用了门面模式,一个create包含了很多神操作!

图片看不清晰没所谓,我还会一步一步解析:

 Utils.validateServiceInterface(service);//验证是否为接口
    if (validateEagerly) {
      eagerlyValidateMethods(service);//这里有个缓存校验  详情看下面
    }
  private void eagerlyValidateMethods(Class
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值