Retrofit源码分析以及MVP框架封装使用

编程入门 行业动态 更新时间:2024-10-28 04:20:12

Retrofit<a href=https://www.elefans.com/category/jswz/34/1770099.html style=源码分析以及MVP框架封装使用"/>

Retrofit源码分析以及MVP框架封装使用

阅读此文前请先阅读Retrofit+okhttp网络框架介绍

从上文中我们已经了解通过如下代码即可得到返回给我们call 以及 response对象,今天我们通过源码来分析这个过程是如何实现的。

 /*** 获取天气数据* @param cityname* @param key* @return*/@GET("/weather/index")Call<WeatherData> getWeatherData(@Query("format") String format, @Query("cityname") String cityname, @Query("key") String key);
private static final String ENDPOINT = "";private static final Retrofit sRetrofit = new Retrofit.Builder().baseUrl(ENDPOINT).addConverterFactory(GsonConverterFactory.create())//.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 使用RxJava作为回调适配器.build();private static final ApiManagerService apiManager = sRetrofit.create(ApiManagerService.class);ApiManager.getWeatherData(format,city).enqueue(new Callback<WeatherData>() {@Overridepublic void onResponse(Call<WeatherData> call, Response<WeatherData> response) {mWeatherOnListener.onSuccessData(response.body());}@Overridepublic void onFailure(Call<WeatherData> call, Throwable t) {mWeatherOnListener.onFailure(t);}});

分析流程图

ok,那我们就开始按照以上流程图,来揭开Retrofit的面纱,下面逐步介绍,最后在简单总结。

源码分析

1、Retrofit的构建

这里是通过构造者模式进行构建retrofit对象,好在其内部的成员变量比较少,我们直接看build()方法。

public Builder() {this(Platform.get());
}public Retrofit build() {if (baseUrl == null) {throw new IllegalStateException("Base URL required.");}okhttp3.Call.Factory callFactory = this.callFactory;if (callFactory == null) {callFactory = new OkHttpClient();}Executor callbackExecutor = this.callbackExecutor;if (callbackExecutor == null) {callbackExecutor = platform.defaultCallbackExecutor();}// Make a defensive copy of the adapters and add the default Call adapter.List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));// Make a defensive copy of the converters.List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,callbackExecutor, validateEagerly);
}
  • baseUrl必须指定,这个是理所当然的;
  • 然后可以看到如果不着急设置callFactory,则默认直接new
    OkHttpClient(),可见如果你需要对okhttpclient进行详细的设置,需要构建OkHttpClient对象,然后传入;
  • 接下来是callbackExecutor,这个想一想大概是用来将回调传递到UI线程了,当然这里设计的比较巧妙,利用platform对象,对平台进行判断,判断主要是利用Class.forName(“”)进行查找。
  • 如果是Android平台,会自定义一个Executor对象,并且利用Looper.getMainLooper()实例化一个handler对象,在Executor内部通过handler.post(runnable)。
  • 接下来是adapterFactories,这个对象主要用于对Call进行转化,基本上不需要我们自己去自定义。
  • 最后是converterFactories,该对象用于转化数据,例如将返回的responseBody转化为对象等;当然不仅仅是针对返回的数据,还能用于一般备注解的参数的转化例如@Body标识的对象做一些操作,后面遇到源码详细再描述。

Class.forName(“”)查找的源码,值得学习,以后用来判断平台可以复制以下源码。

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) {}try {Class.forName("org.robovm.apple.foundation.NSObject");return new IOS();} catch (ClassNotFoundException ignored) {}return new Platform();}

2、外观模式(门面模式)

Retrofit给我们暴露的方法和类不多。核心类就是Retrofit,我们只管配置Retrofit,然后做请求。剩下的事情就跟上层无关了,只需要等待回调。这样大大降低了系统的耦合度。对于这种写法,我们叫外观模式(门面模式)。

几乎所有优秀的开源library都有一个门面。比如 Glide.with() ImageLoader.load() Alamofire.request() 。有个门面方便记忆,学习成本低,利于推广品牌。 Retrofit的门面就是 retrofit.create().

3、(重点)从retrofit.create()在往下分析

3.1retrofit如何为我们的接口实现实例

更多推荐

Retrofit源码分析以及MVP框架封装使用

本文发布于:2024-03-06 08:04:28,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1714796.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:源码   框架   Retrofit   MVP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!