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.javapublic <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 加入
我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。











评论