Kotlin 协程 的实战,retrofit面试

本文介绍了如何在 Kotlin 中使用协程配合 Retrofit 进行网络请求,包括在 ViewModel 中的使用、错误处理函数 `launch` 和 `handleException` 的实现,以及 `launchOnlyresult` 函数用于处理请求结果和错误。此外,还提到了导航数据的获取方法。最后强调了程序员需要不断学习以适应技术环境的变化。
摘要由CSDN通过智能技术生成
  * 玩安卓轮播图
 */
@GET("banner/json")
suspend fun getBanner(): BaseResult<List<BannerBean>> 

和之前我们写的有什么区别呢:

1.  前面多了**suspend**关键字,带有这个关键字的函数,只有在协程中才能调用,在普通函数调用会报错的,编译也过不了
2.  返回结果只直接写对应的Bean就好了,不需要固定类型来包装

下边的用法是在ViewModel中来使用的,如果想在Activity或者Fragment中使用,是一样的,只不过启动协程的时候写法有些不同。 下面在我们的VIewModel中:

private val repository by lazy {
RetrofitClient.getInstance().create(HomeService::class.java)
}

 fun getBanner() {
    viewModelScope.launch {
        val result = repository.getBanner()
        if (result.errorCode == 0) {
            LogUtils.d(result.data)
        }
    }
} 

这样一个简单的网络请求就完成,**viewModelScope.launch {}** 这个就是在ViewModel中启动一个协程,**他会在ViewModel销毁的时候,自动取消他自己和在他内部启动的所有协程** 相对于RxJava来说,我们每次都要关心生命周期防止内存泄露,是不是加方便些呢,这样我们不用关心内存泄露的问题了。所以我们要启动子协程,都要写在他内部,除非有特殊需求,比如页面销毁了,要做些其他工作。否则都尽量在他内部启动。  
好了,我们再看上面的代码,会发现有个问题,\*\*viewModelScope.launch {}\*\*是直接启动在主线程的,所以协程也会运行在主线程中,那我们怎么能让网络请求去影响到UI呢,绝对不能忍。我们可以在启动一个子协程让他运行在IO线程上。修改如下:

viewModelScope.launch {
val result = withContext(Dispatchers.IO) { repository.getBanner() }
if (result.errorCode == 0) {
LogUtils.d(result.data)
}
}


这下就正常了,是不是相当方便,代码也清
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值