get 方法的参数 Type 和 Annotation[] 分别 对应 定义的api方法的 返回值Type 和 方法的注解 ,下图比较清晰。
图中可以看出 returnType 对应 LiveData<LoginInfo> ,而 annotations 则对应 POST和FormUrlEncoded 。
但是 returnType 直接获取到的不是 LiveData ,上一篇文章就说到 Type的几个子接口类 ,这里就要用到了。
先调用辅助方法 getRawType(returnType) ,取得原始类型,判断是否是 LiveDataclass ,不是的话返回 null ,这样 retrofit就会循环下一个Factory ,直到 返回值不为空的CallAdapter 。
如果原始类型是 LiveDataclass ,则判断是否是 ParameterizedType ,否则抛出异常。通过 getParameterUpperBound(0, (ParameterizedType) returnType) 获取泛型 Type responseType ,最后将这个 responseType 作为参数传给 CallAdapter 。
PS:这里使用 getRawType(responseType) 的话,得到的原始类型会是 LoginInfo 。
从上面可知, get方法可以理解为判断是否是对应的CallAdapter和取得必要参数的方法 。而且还可以通过在 定义的api方法(如:login)那里添加注解 来做一些特殊 *** 作。
这里继续以上面的 LiveData<LoginInfo> 为例,可以在 adapt 方法创建一个 LiveData 且作为返回值返回。
然后通过 call 访问接口获取数据,将返回来的数据通过 livaDatapostValue() 通知到外部,这样就完成了获取数据且关联了生命周期。
上图所示,创建 LoginService 调用 login 方法,因为返回的是 LiveData 所以使用起来跟普通的一样就好了,设置 Observer ,在 onChanged 方法回调更新数据。
现代Android开发中,Retrofit是主流的网络请求框架,内部封装Ok>
Background concurrent copying GC freed 817417(13MB) AllocSpace objects, 46(1880KB) LOS objects, 12%
这是Json解析错误的打印输出,很可能是你的数据类里包含了Drawable或者其他图形相关的属性
以上就是关于Retrofit的CallAdapter详解全部的内容,包括:Retrofit的CallAdapter详解、Retrofit 源码分析、在用Retrofit的Gson解析器遇到的坑等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)