Android开发之MVVM模式实践(六),2021字节跳动春招技术面试题

本文介绍了Android开发中MVVM模式下如何使用协程和Retrofit。通过lifecycle-viewmodel-ktx库,简化ViewModel中协程的使用。详细阐述了协程的创建,Retrofit接口的改造,以及如何处理网络请求的异常。同时,展示了如何在BaseViewModel中封装协程,以便在主线程和IO线程中执行任务。文章还解释了如何处理HttpError,以及Retrofit的使用技巧,包括错误处理和请求成功后的数据解析。
摘要由CSDN通过智能技术生成

以上是我们创建协程的实现方式,我们可以通过指定Dispatchers来决定协程到底在什么线程中工作,而其实Kotlin的协程核心库中也为我们提供封装好了的scope,例如MainScope,源码如下:

@Suppress(“FunctionName”)
public fun MainScope(): CoroutineScope = ContextScope(SupervisorJob() + Dispatchers.Main)

非常明显,Kotlin提供的MainScope内部实现与我们自行创建的CoroutineScope一模一样,MainScope在一定程度上方便了我们创建协程。

lifecycle-viewmodel-ktx

知晓协程如何创建后,我们需要思考一个问题:协程主要的使用层是MVVM的哪一层?因为协程最主要的作用是用同步编码的方式来实现异步;既然有异步,那么直接操作UI的View层明显是不太适合使用协程的,剩下的ViewModel与Model层则都很适合添加协程封装。我们先从ViewModel开始添加协程,幸运的是Google已经考虑到了这一层,并为我们提供了相关依赖,导入方式如下:

implementation ‘androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0’

在导入此依赖后,会为ViewModel添加一个名为viewModelScope的扩展函数,此函数会创建一个做了优化的协程,源码如下:

val ViewModel.viewModelScope: CoroutineScope
get() {
val scope: CoroutineScope? = this.getTag(JOB_KEY)
if (scope != null) {
return scope
}
return setTagIfAbsent(JOB_KEY,
CloseableCoroutineScope(SupervisorJob() + Dispatchers.Main.immediate))
}

拿到viewModelScope后,我们就可以在BaseViewModel添加如下代码:

abstract class BaseViewModel : ViewModel(), ViewModelLifecycle, ViewBehavior {
/**

  • 在主线程中执行一个协程
    */
    protected fun launchOnUI(block: suspend CoroutineScope.() -> Unit): Job {
    return viewModelScope.launch(Dispatchers.Main) { block() }
    }

/**

  • 在IO线程中执行一个协程
    */
    protected fun launchOnIO(block: suspend CoroutineScope.() -> Unit): Job {
    return viewModelScope.launch(Dispatchers.IO) { block() }
    }
    }

二、与Retrofit的结合

目前

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值