android moshi 使用_JetPack知识点实战系列三:使用 Coroutines, Retrofit, Moshi实现网络数据请求...

本节教程我们将使用Retrofit网络请求库实现网易云音乐的推荐歌单的数据请求。请求的过程中我们将使用Coroutines实现异步操作,并且利用Moshi进行网络数据的解析。

我们的接口来自于开源库NeteaseCloudMusicApi,这个NodeJS API 库的文档非常完善,并且支持的接口非常多。这个库的安装请详阅该项目的参考文档。

网易音乐API

kotlin - Coroutine 协程

协程是kotlin的一个异步处理框架,是轻量级的线程。

协程的几大优势:

可以用写同步的代码结构样式实现异步的功能

非常容易将代码逻辑分发到不同的线程中

和作用域绑定,避免内存泄露。可以无缝衔接LifeCycle和ViewModel等JetPack库

减少模板代码和避免了地狱回调

接下来我将详细介绍下协程的概念和使用方法。

启动协程

启动协程使用最多的方式(主要)有launch和async

public fun CoroutineScope.launch(

context: CoroutineContext = EmptyCoroutineContext,

start: CoroutineStart = CoroutineStart.DEFAULT,

block: suspend CoroutineScope.() -> Unit

): Job

public fun CoroutineScope.async(

context: CoroutineContext = EmptyCoroutineContext,

start: CoroutineStart = CoroutineStart.DEFAULT,

block: suspend CoroutineScope.() -> T

): Deferred

返回值 Job

Deferred其实是Job的子类,所以这两个启动方法的返回值都是Job,那Job有什么特性呢?

Job 代表一个异步的任务

Job 具有生命周期并且可以取消。

Job 还可以有层级关系,一个Job可以包含多个子Job,当父Job被取消后,所有的子Job也会被自动取消;当子Job出现异常后父Job也会被取消。

Deferred有一个await方法就能取到协程的返回值,这是和Job的重要区别:

launch启动的协程的结果没有返回值,async启动的协程会返回值.这就是Kotlin为什么设计有两个启动方法的原因了。

public interface Deferred : Job {

public suspend fun await(): T

}

总结:launch 更多是用来发起一个无需结果的耗时任务(如批量文件删除、混合图片等),async用于异步执行耗时任务,并且需要返回值(如网络请求、数据库读写、文件读写)。

调用对象 CoroutineScope

启动协程需要在一定的协程作用域CoroutineScope下启动。

public fun CoroutineScope(context: CoroutineContext): CoroutineScope =

ContextScope(if (context[Job] != null) context else context + Job())

通过CoroutineScope的构造方法我们得知:

构造的时候需要Job,如果没有传入就会在内部新建一个Job做为这个协程的父Job来管理该协程的所有任务Job。

这儿的CoroutineContext我们可以简单的等于CoroutineDispatcher。这个稍后介绍。

协程作用域可以通过以下方式获得:

Global Scope --- 和APP的生命周期一致

LiveDataScope, ViewModelScope, lifecycleScope 等 --- 和这些类的生命周期一致 (涉及到的内容后面的教程会有解释)

自定义 Scope --- 自己定义Scope࿰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值