ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android进阶:七、Retrofit2-0原理解析之最简流程,kotlin高阶函数和lambda示例

2022-01-19 15:58:10  阅读:214  来源: 互联网

标签:最简 Retrofit2 示例 create baseUrl public Platform 我们 retrofit


  • 生成接口实现类:

GithubApiService githubService = retrofit.create(service)
Call call = githubService.searchRepoInfo(“changmu175”);

我们调用retrofit的create方法就可以把我们定义的接口转化成实现类,我们可以直接调用我们定义的方法进行网络请求,但是我们只定义了一个接口方法,也没有方法体,请求方式和参数类型都是注解,create是如何帮我们整理参数,实现方法体的呢?一会我们通过源码解析再去了解。

  • 发起网络请求

//同步请求方式
call.request();
//异步请求方式
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
//请求成功回调
}

@Override
public void onFailure(Call call, Throwable t) {
//请求与失败回调
}
});

至此,retrofit的一次网络请求示例
已经结束,基于对okhttp的封装,让网络请求已经简化了很多。当然retrofit最适合的还是REST API类型的接口,方便简洁。

下面我们就看看retrofit的核心工作是如何完成的!

###二.retrofit初始化
retrofit的初始化采用了链式调用的设计

Retrofit retrofit = new Retrofit.Builder()
.baseUrl(“https://api.github.com/”)
.build();

很明显这个方法是在传一些需要的参数,我们简单的跟踪一下:

首先看看Builder()的源码:

public Builder() {
this(Platform.get());
}

这句代码很简单就是调用了自己的另一个构造函数:

Builder(Platform platform) {
this.platform = platform;
}

这个构造函数也很简单,就是一个赋值,我们把之前的Platform.get()点开,看看里面做在什么:

private static final Platform PLATFORM = findPlatform();

static Platform get() {
return PLATFORM;
}

我们发现这里使用使用了一个饿汉式单例,使用Platform.get()返回一个实例,这样写的好处是简单,线程安全,效率高,不会生成多个实例!

我们再看看findPlatform() 里做了什么:

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

…省略部分代码…
}

所以是判断了一下系统,然后根据系统实例化一个对象。这里面应该做了一些和Android平台相关的事情,属于细节,我们追究,感兴趣的可以只看看。
再看看baseUrl(url)的源码

public Builder baseUrl(String baseUrl) {
checkNotNull(baseUrl, “baseUrl == null”);
HttpUrl httpUrl = HttpUrl.parse(baseUrl);

return baseUrl(httpUrl);
}

public Builder baseUrl(HttpUrl baseUrl) {
checkNotNull(baseUrl, “baseUrl == null”);

this.baseUrl = baseUrl;
return this;
}

这两段代码也很简单,校验URL,生成httpUrl对象,然后赋值给baseUrl

看看build() 方法在做什么
参数基本设置完了,最后就要看看build() 这个方法在做什么:

public Retrofit build() {
if (baseUrl == null) {
throw new IllegalStateException(“Base URL required.”);
}

okhttp3.Call.Factory callFactory = this.callFactory;
if (callFactory == null) {
callFactory = new OkHttpClient();
}

return new Retrofit(callFactory, baseUrl, unmodifiableList(converterFactories),
unmodifiableList(callAdapterFactories), callbackExecutor, validateEagerly);
}
}
}

代码中有大量的参数校验,有些复杂的参数我们没有传,所以我就把那些代码删除了。简单看一下也能知道,这段代码就是做一些参数校验,baseUrl不能为空否则会抛异常,至于其他的参数如果为null则会创建默认的对象。其中callFactory就是okhttp的工厂实例,用于网络请求的。
最后我们看到,这个方法最终返回的是一个Retrofit的对象,初始化完成。

###三.生成接口实现类
刚才我们就讲过retrofit.create这个方法很重要,它帮我们生成了接口实现类,并完成了方法体的创建,省去了我们很多工作量。那我们来看看它是如何帮我们实现接口的。

public T create(final Class service) {
.create这个方法很重要,它帮我们生成了接口实现类,并完成了方法体的创建,省去了我们很多工作量。那我们来看看它是如何帮我们实现接口的。

public T create(final Class service) {

标签:最简,Retrofit2,示例,create,baseUrl,public,Platform,我们,retrofit
来源: https://blog.csdn.net/m0_66264324/article/details/122582914

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有