Retrofit 源码解读 HTTP
发布于: 58 分钟前
1.项目概要:
本文主要介绍Retrofit如何使用,源码解读,如何实现HTTP请求?
复制代码
2.背景和需求
实现 Service interface 接口类
public interface IMSearchUserService {
@FormUrlEncoded
@POST("/user/heartbeat")
Observable<Result> ping(@FieldMap Map<String, Object> fields);
}
复制代码
构建 Retrofit 来实例化 IMSearchUserService 实例
Gson gson = new GsonBuilder() // 用于json的序列化
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.serializeNulls()
.create();
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); // okhttp的拦截器
TokenInterceptor tokenInterceptor = new TokenInterceptor(); // 自定义okhttp的拦截器
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(tokenInterceptor)
.addInterceptor(interceptor)
.retryOnConnectionFailure(true)
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.build();
Retrofit mRetrofit = new Retrofit.Builder()
.baseUrl(ServerConfig.getInstance().getBaseUrl())
.client(client)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
// .addConverterFactory(FastJsonConverterFactory.create())
.build();
IMSearchUserService service = mRetrofit.create(IMSearchUserService.class);
复制代码
调用 IMSearchUserService 接口中的 ping 方法
final Map<String, Object> params = new HashMap<>();
params.put("userId", loginUserId);
params.put("access_token", mAccessToken);
service.ping(params)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> { // 请求成功
// 对请求结果进行解析
}, throwable -> { // 请求失败异常
LogUtil.printException(throwable);
});
复制代码
3.实现原理
Retrofit 是如何实例化接口类的?
// Retrofit.java
public <T> T create(final Class<T> service) {
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get();
@Override public 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);
}
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
ServiceMethod<Object, Object> serviceMethod =
(ServiceMethod<Object, Object>) loadServiceMethod(method);
OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
复制代码
4.使用方法
未完待续
5.对比
未完待续
6.成果展示
未完待续
7.参考文献
未完待续
划线
评论
复制
发布于: 58 分钟前阅读数: 2
版权声明: 本文为 InfoQ 作者【Changing Lin】的原创文章。
原文链接:【http://xie.infoq.cn/article/baa9556bb0552c447e8bc2720】。文章转载请联系作者。
Changing Lin
关注
获得机遇的手段远超于固有常规之上~ 2020.04.29 加入
我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。
评论