本节教程我们将使用Retrofit网络请求库实现网易云音乐的推荐歌单的数据请求。请求的过程中我们将使用Coroutines实现异步操作,并且利用Moshi进行网络数据的解析。
我们的接口来自于开源库NeteaseCloudMusicApi,这个NodeJS 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 <T> CoroutineScope.async(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> T
): Deferred<T>
返回值 Job
Deferred其实是Job的子类,所以这两个启动方法的返回值都是Job,那Job有什么特性呢?
- Job 代表一个异步的任务
- Job 具有生命周期并且可以取消。
- Job 还可以有层级关系,一个Job可以包含多个子Job,当父Job被取消后,所有的子Job也会被自动取消;当子Job出现异常后父Job也会被取消。
Deferred有一个await方法就能取到协程的返回值,这是和Job的重要区别:
launch启动的协程的结果没有返回值,async启动的协程会返回值.这就是Kotlin为什么设计有两个启动方法的原因了。
public interface Deferred<out T> : 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

本文详细介绍了如何使用Kotlin协程配合Retrofit网络请求库实现网易云音乐推荐歌单的数据获取,涵盖了协程的基本概念、启动方法、异常处理及与Retrofit的无缝衔接。

2934

被折叠的 条评论
为什么被折叠?



