博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Retrofit与LiveData结合
阅读量:5944 次
发布时间:2019-06-19

本文共 2395 字,大约阅读时间需要 7 分钟。

Retrofit与LiveData结合

写上题目有点不知道怎么写了的很短暂的尴尬

有个问题,为什么我们可以直接更改service接口方法的返回值。

先解释一波,相信我们都对Rxjava+Retrofit使用很熟悉了吧,回忆一下步骤

  • 添加了Retrofit对Rxjava支持的依赖

    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'复制代码
  • 在构建Retrofit实例的时候添加了RxJavaCallAdapterFactory

    addCallAdapterFactory(RxJava2CallAdapterFactory.create())复制代码
  • 然后好像就可以直接更改接口方法的返回值进行使用了

    @POST("test")fun test():LiveData复制代码

这个CallAdapterFactory是什么,为什么能够达到更改返回值进行使用

熟悉Retrofit源码或者了解过的人就知道CallAdapter是Retrofit的请求适配器,CallAdapterFactory用于获取CallAdapter实例,然后调用了CallAdapter的adapt方法返回你想要适配的返回值,就可以达到我们直接修改返回值进行使用的效果了

补充一句,Retrofit真的设计的美

好的开始我的表演

LiveDataCallAdapterFactory

直接贴上代码

class LiveDataCallAdapterFactory : CallAdapter.Factory() {    /**     * 如果你要返回     * LiveData
*/ override fun get(returnType: Type?, annotations: Array
?, retrofit: Retrofit?): CallAdapter<*, *>? { if(returnType !is ParameterizedType){ throw IllegalArgumentException("返回值需为参数化类型") } //获取returnType的class类型 val returnClass = CallAdapter.Factory.getRawType(returnType) if(returnClass != LiveData::class.java){ throw IllegalArgumentException("返回值不是LiveData类型") } //先解释一下getParameterUpperBound //官方例子 //For example, index 1 of {@code Map
} returns {@code Runnable}. //获取的是Map
参数列表中index序列号的参数类型,即0为String,1为Runnable //这里的0就是LiveData
中?的序列号,因为只有一个参数 //其实这个就是我们请求返回的实体 val type = CallAdapter.Factory.getParameterUpperBound(0, returnType as ParameterizedType) return LiveDataCallAdapter
(type) } /** * 请求适配器 */ class LiveDataCallAdapter
(var type:Type):CallAdapter
>{ override fun adapt(call: Call
?): LiveData
{ return object:LiveData
(){ //这个作用是业务在多线程中,业务处理的线程安全问题,确保单一线程作业 val flag = AtomicBoolean(false) override fun onActive() { super.onActive() if(flag.compareAndSet(false,true)){ call!!.enqueue(object: Callback
{ override fun onFailure(call: Call
?, t: Throwable?) { postValue(null) } override fun onResponse(call: Call
?, response: Response
?) { postValue(response?.body()) } }) } } } } override fun responseType(): Type { return type } }}复制代码

注释都在代码中,相信大家都能明白的

自定义CallAdapterFactory完了就可以在构建Retrofit实例的时候添加该Factory了,就可以使用

建议大家都尝试自己自定义一个,没有看过Retrofit源码的也该看了

其实有几个小知识点

第一个

第二个

也可以参照一下官方的例子

写代码要知道原理,总不能老是复制粘贴拿来主义吧

转载地址:http://pgwxx.baihongyu.com/

你可能感兴趣的文章
通讯组基本管理任务三
查看>>
赫夫曼编码实现
查看>>
html页面显示div源代码
查看>>
基础复习-算法设计基础 | 复杂度计算
查看>>
debian、ubuntu系统下,常用的下载工具
查看>>
带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例
查看>>
OSGI企业应用开发(十二)OSGI Web应用开发(一)
查看>>
Python 以指定概率获取元素
查看>>
微信公众平台图文教程(二) 群发功能和素材管理
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
wdcp 安装
查看>>
asterisk配置
查看>>
GA操作步骤和技巧(二)——用户行为分析
查看>>
shell中while循环里使用ssh的注意事项
查看>>
SHELL获取计算机外网ip的几种写法
查看>>
博客正在搬迁中
查看>>
触发器与存储过程的区别
查看>>
我的友情链接
查看>>
centos搭建supervisor
查看>>
linux日志分割
查看>>