Retrofit
2020-09-14 本文已影响0人
壹零二肆
- 1 概述
- 2 使用介绍
- 3 流程剖析
- 4 源码架构
https://square.github.io/retrofit/
https://github.com/square/retrofit
1 概述
Retrofit是一个适用于 Android 和 Java 的 HTTP 请求库
底层为 OkHttp 进行网络请求, Gson 进行响应解析
2 使用介绍
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
// .client(getOkHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.build();
GitHubService gitHubService = retrofit.create(GitHubService.class);
Call<List<Repo>> repos = gitHubService.listRepos("square");
repos.enqueue(new Callback<List<Repo>>() {
@Override
public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
}
@Override
public void onFailure(Call<List<Repo>> call, Throwable t) {
}
});
需要使用 OkHttp 更多的能力,比如怎加 拦截器 则可以构造 OkHttpClient 传递给 Retrofit
举个例子:
private static OkHttpClient getOkHttpClient() {
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.removeHeader("User-Agent")//移除旧的
.addHeader("User-Agent", WebSettings.getDefaultUserAgent(app))//添加真正的头部
.build();
return chain.proceed(request);
}
}).build();
return httpClient;
}
3 流程剖析
应用层 传输层core concept 都在图中
大致可以窥见一个 移动端的网络架构
应用层
传输层
接触较多,其他层开发中接触较少
4 源码结构
Retrofit
- serviceMethodCache
- callFactory(OkHttpClient)
- baseUrl
- converterFactories
- callAdapterFactories
- callbackExecutor
HttpServiceMethod
- RequestFactory
- callFactory
- responseConverter
DefaultCallAdapterFactory
- get() ---> ExecutorCallbackCall
- callbackExecutor
- delegate (Call)
GsonConverterFactory
- gson
OkHttpCall
- requestFactory
- args
- callFactory
- responseConverter
- canceled
- rawCall
- executed
5 总结
Retrofit 封装了 Http 请求为 Java 接口,通过注解来描述请求
很多设计亮点:
1 更新UI 方法
static final class MainThreadExecutor implements Executor {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override
public void execute(Runnable r) {
handler.post(r);
}
}
2 动态代理
接口 --> 拦截方法调用
Proxy.newProxyInstance(
service.getClassLoader(),
new Class<?>[] {service},
new InvocationHandler() {
private final Platform platform = Platform.get();
private final Object[] emptyArgs = new Object[0];
@Override
public @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args)
throws Throwable {
// If the method is a method from Object then defer to normal invocation.
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
args = args != null ? args : emptyArgs;
return platform.isDefaultMethod(method)
? platform.invokeDefaultMethod(method, service, proxy, args)
: loadServiceMethod(method).invoke(args);
}
});
3 设计模式
-
建造器模式 : 连缀表达式,构造函数参数过多考虑
-
工厂模式
-
适配器模式 :接受多个 特性 构造一个通用对象
-
门面模式 : 封装具体实现
-
观察者模式