Retrofit 支持 Kotlin 协程

上期 Retrofit 源码解读,这期查看下如何支持 Kotlin 协程的。(上篇的 retrofit 版本 可能与这篇不同)

例子还是最简单的标准例子,定义 interface 接口,这里就不贴多余代码了

    @GET("/app/v1/commodity")
    suspend fun commodity(
        @Query("pageNo") pageNo: Int,
        @Query("pageSize") pageSize: Int
    ): BaseResult<Pager<CommodityPO>>

第一步先将 kotlin 代码转成 Java 代码查看 suspend 方法有何不同,以下是转换后的代码

   @GET("/app/v1/commodity")
   @Nullable
   Object commodity(@Query("pageNo") int var1, @Query("pageSize") int var2, @NotNull Continuation var3);

可以看到多出一个 Continuation 的参数,此为协程相关的 kotlin.coroutines.Continuation 接口示例。注意这里 BaseResult<Pager<CommodityPO>> 被转换成 Object 了。

@SinceKotlin("1.3")
public interface Continuation<in T> {

    public val context: CoroutineContext

    public fun resumeWith(result: Result<T>)
}

了解协程的应该已经猜出答案了,难道是 Continuation 类型的 var3 直接回调嘛,答案确实是。但我们重点是去探究下 Retrofit 如何架构的,所以跟进源码去查看一番。我们直接转到 动态代理的 create() 方法中

  public <T> T create(final Class<T> service) {
    validateServiceInterface(service);
    return (T)
        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 {
//...
                args = args != null ? args : emptyArgs;
                return platform.isDefaultMethod(method)
                    ? platform.invokeDefaultMethod(method, service, proxy, args)
                    : loadServiceMethod(method).invoke(args);
              }
            });
  }

同理,会调用 loadServiceMethod 方法,将 Method 传入,去获取 ServiceMethod 对象。

  ServiceMethod<?> loadServiceMethod(Method method) {
//...
        result = ServiceMethod.parseAnnotations(this, method);
//...
    return result;
  }

一个缓存标准实现后,进入parseAnn

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值