老三长谈之Retrofit源码分析

来源:互联网 发布:天池 大数据 编辑:程序博客网 时间:2024/05/01 23:28

老三长谈之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
原创粉丝点击