作者:双鱼獒主 | 来源:互联网 | 2023-09-18 07:32
1概述2使用介绍3流程剖析4源码架构https:square.github.ioretrofithttps:github.comsquareretrofit1概述Retrofit是
- 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> 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> repos = gitHubService.listRepos("square");repos.enqueue(new Callback>() {@Overridepublic void onResponse(Call> call, Response> response) {}@Overridepublic void onFailure(Call> call, Throwable t) {}});
需要使用 OkHttp 更多的能力,比如怎加 拦截器 则可以构造 OkHttpClient 传递给 Retrofit
举个例子:
private static OkHttpClient getOkHttpClient() {OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {@Overridepublic 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
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());@Overridepublic 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];@Overridepublic @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 设计模式
- 建造器模式 : 连缀表达式,构造函数参数过多考虑
- 工厂模式
- 适配器模式 :接受多个 特性 构造一个通用对象
- 门面模式 : 封装具体实现
- 观察者模式