两种方式封装Retrofit+协程,实现优雅快速的网络请求

本文介绍了如何使用Retrofit结合协程进行网络请求的优雅封装,对比了两种不同的封装方式。第一种方式利用LiveData贯穿网络请求,简化了线程切换,但存在解耦不彻底的问题。第二种方式进一步优化,通过分离Loading状态和网络请求,避免了UI耦合,实现了更灵活的数据源管理,更适合多数据源场景。文章还详细解析了实现原理,提供了具体的代码示例。
摘要由CSDN通过智能技术生成

private val repository by lazy { WxArticleRepository() }

val wxArticleLiveData = StateLiveData<List>()

fun requestNet() {

viewModelScope.launch {

repository.fetchWxArticle(wxArticleLiveData)

}

}

}

很简单,引入对应的数据仓库Repo,然后使用协程执行网络请求方法。来看下Repo中的代码。

Repository中代码示例


class WxArticleRepository : BaseRepository() {

private val mService by lazy { RetrofitClient.service }

suspend fun fetchWxArticle(stateLiveData: StateLiveData<List>) {

executeResp(stateLiveData, mService::getWxArticle)

}

}

interface ApiService {

@GET(“wxarticle/chapters/json”)

suspend fun getWxArticle(): BaseResponse<List>

}

获取一个Retrofit实例,然后调用ApiService接口方法。

封装一的优势

======

  • 代码很简洁,不需要手写线程切换代码,没有很多的接口回调。

  • 自带Loading状态,不需要手动启用Loading和关闭Loading。

  • 数据驱动ui,以LiveData为载体,将页面状态和网络结果通过在LiveData返回给ui。

封装一的不足

======

封装一的核心思想是:一个LiveData贯穿整个网络请求链。这是它的优势,也是它的劣势。

  • 解耦不彻底,违背了"在应用的各个模块之间设定明确定义的职责界限"的思想

  • LiveData监听时,如果需要Loading,BaseActivity都需要实现带有Loading方法接口。

  • obserState()方法第二个参数中传入了UI引用。

  • 不能达到"看方法如其意",如果是刚接触,会有很多疑问:为什么需要一个livedata作为方法的参数。网络请求的返回值去哪了?

  • 封装一还有一个最大的缺陷:对于是多数据源,封装一就展示了很不友好的一面。

Repository是做一个数据仓库,项目中获取数据的方式都在这里同意管理,网络获取数据只是其中一个方式而已。

如果想加一个从数据库或者缓存中获取数据,封装一想改都不好改,如果强制改就破坏了封装,侵入性很大。

针对封装一的不足,优化出了封装二。

二、封装二

=====

思路

  • 想要解决上面的不足,不能以LiveData为载体贯穿整个网络请求。

  • Observe()方法中去掉ui引用,不要小看一个ui引用,这个引用代表着具体的ActivityObserve耦合起来了,并且Activity还要实现IUiView接口。

  • 网络请求跟Loading状态分开了,需要手动控制Loading。

  • Repository中的方法都有返回值,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值