Kotlin语言基础入门到熟悉:Kotlin协程基础
1. 阻塞与非阻塞
runBlocking
delay
是非阻塞的,Thread.sleep
是阻塞的。显式使用 runBlocking
协程构建器来阻塞。
可以看到,runBlocking
里使用了delay
来延迟。用了runBlocking
的主线程会一直阻塞直到runBlocking
内部的协程执行完毕。 也就是runBlocking{ delay }
实现了阻塞的效果。
我们也可以用runBlocking
来包装主函数。
runBlocking<Unit>
中的<Unit>
目前可以省略。
runBlocking
也可用在测试中
单元测试
使用@Test
设置测试
运行结果
IDEA可能会提示no tasks available
。需要把测试选项改为IDEA,如下图。
更改设置
2. 等待
有时候需要等待协程执行完毕。可以用join()
方法。这个方法会暂停当前的协程,直到执行完毕。需要用main() = runBlocking
。
运行log
3. 结构化的并发
用GlobalScope.launch
时,会创建一个顶层协程。它不使用主线程。新创的协程虽然轻量,但仍会消耗一些内存资源。如果忘记保持对新启动的协程的引用,它还会继续运行。
我们可以在代码中使用结构化并发。
示例中,我们使用runBlocking
协程构建器将main
函数转换为协程。在里面(作用域)启动的协程不需显式使用join
。
观察下面的例子:
运行log
可以看到,不用像之前那样调用Thread.sleep
或者delay
让主线程等待一段时间,防止虚拟机退出。
程序会等待它所有的协程执行完毕,然后真正退出。
4. 作用域构建器
使用 coroutineScope
构建器声明自己的作用域。它会创建一个协程作用域,并且会等待所有已启动子协程执行完毕。
runBlocking
与 coroutineScope
看起来类似,因为它们都会等待其协程体以及所有子协程结束。主要区别在于:
* runBlocking
方法会阻塞当前线程来等待,是常规函数
* coroutineScope
只是挂起,会释放底层线程用于其他用途,是挂起函数
下面这个示例展示了作用域构建器的特点。main
是一个作用域。
运行log
5. 提取函数重构
将launch { …… }
内部的代码块提取到独立的函数中。提取出来的函数需要 suspend 修饰符,它是挂起函数。
log
6. 协程是轻量的
我们前面也试过,创建非常多的协程,程序运行OK。
下面的代码可以输出很多的点
7. 全局协程像守护线程
如果进程中只剩下了守护线程,那么虚拟机会退出。 前文那个的例子,其实也能看到,字符没打印完程序就结束了。
在 GlobalScope 中启动的活动协程并不会使进程保活。它们就像守护线程。
再举一个例子
log
最后分享一份
【腾讯技术团队出品】Android零基础入门到精通,Android Studio安装教程+全套安卓基础教程
Android编程入门教程
Java语言基础从入门到熟悉
Kotlin语言基础从入门到熟悉
Android 技术栈从入门到熟悉
Android Jetpack 全家桶全面学习
对于新手来说可能安装Android Studio存在一定困难你可以看着以下视频,一步步的跟着学习安装运行
Android Studio 安装教程
有了Java阶段的学习,这一阶段建议以视频学习为主辅以图书查漏补缺。如果以图书为主,可以根据图书讲解敲代码,辅以教学视频查漏补缺。遇到问题可以去百度,入门的问题一般会有很多人遇到,并且给出比较好的解答。
需要掌握基本知识点,比如四大组件如何使用、如何创建Service、如何进行布局、简单的自定义View、动画、网络通信等常见技术。