3、runOnUiThread
可以说是很无脑了,在子线程中想更新UI,直接写一个runOnUiThread{}包裹着UI更新相关的代码即可,示例如下:
点进源码康康:
噢,还挺简单:
Activity中定义了此函数,判断当前线程是否为主线程,不是 → Handler.post,是 → 直接执行UI更新。
回调确实是个好东西,但是多层次的回调嵌套,可能会形成 Callback Hell(回调地狱),比如现在有这样的逻辑:
访问百度 → 展示内容(UI) → 下载图标 → 显示图标(UI) → 生成缩略图 → 显示缩略图(UI) → 上传缩略图 → 界面更新(UI)
按照这样的逻辑,用runOnUiThread一把梭,伪代码如下:
常见的规避方法:把嵌套的层次移到外层空间,不使用匿名的回调函数,为每个回调函数命名。
4、RxJava
RxJava在 链式调用 的设计基础上,通过设置 不同的调度器,可以灵活地在 不同线程间切换 并执行对应的Task。
RxJava很强大,但因为较高的学习门槛,大多Android开发仔的认知还停留在:线程切换工具+操作符好用 的阶段。
有兴趣深入学习的RxJava的可以康康《RxJava 沉思录(一):你认为 RxJava 真的好用吗?》
这里只是展示效果,用RxJava写代码的效果,等我变强了,再回来完善这一块:
输出结果如下:
随心所欲,控制线程切换~
5、LiveData
LiveData 是Jetpack提供的一种响应式编程组件,可以包含任何类型的数据,并在数据发生变化时通知给观察者;由于它可以感知并遵循Activity、Fragment或Service等组件的生命周期,因此可以做到仅在组件处于声明周期的激活状态时才更新UI。一般是搭配 ViewModel 组件一起使用的。
MutableLiveData是一种可变的LiveData,提供了两种读数据的方法:
在 主线程中调用的setValue() 和 在非主线程中调用的postValue()
使用时需导入依赖
implementation "androidx.lifecycle:lifecycle-runtime:2.2.0"
使用代码示例如下:
6、Kotlin协程
使用Kotlin协程需要先添加 协程核心库和平台库
依赖(build.gradle中引入):
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7'
使用 withContext 函数可以切换到指定的线程,并在闭包内的逻辑执行结束后,自动把线程切换回上下文继续执行。把RxJava部分的示例改成Kotlin协程的形式,代码示例如下:
使用Kotlin协程后,代码量并没有减少,但是异步代码的编写却轻松多了,开始有一种「同步方式写异步代码」的味道了~
再简化下,把withContext 作为函数的返回值。
0x3、Kotlin中的协程到底是什么
协程
一种 非抢占式(协作式) 的 任务调度模式,程序可以 主动挂起或者恢复执行。
与线程的关系
协程基于线程,但相对于线程轻量很多,可理解为在用户层模拟线程操作;每创建一个协程,都有一个内核态进程动态绑定,用户态下实现调度、切换,真正执行任务的还是内核线程。线程的上下文切换都需要内核参与,而协程的上下文切换,完全由用户去控制,避免了大量的中断参与,减少了线程上下文切换与调度消耗的资源。
根据 是否开辟相应的函数调用栈 又分成两类:
- 有栈协程:有自己的调用栈,可在任意函数调用层级挂起,并转移调度权;
- 无栈协程:没有自己的调用栈,挂起点的状态通过状态机或闭包等语法来实现;
Kotlin中的协程
"假"协程,Kotlin在语言级别并没有实现一种同步机制(锁),还是依靠Kotlin-JVM的提供的Java关键字(如synchronized),即锁的实现还是交给线程处理,因而Kotlin协程本质上只是一套基于原生Java Thread API 的封装。
只是这套API 隐藏了异步实现细节,让我们可以用如同 同步的写法来写异步操作 罢了。
参考文献:
- 迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章
- 了解Kotlin协程实现原理这篇就够了
- Kotlin Coroutines(协程) 完全解析系列
- 并发编程(线程 进程 协程)
- 也来谈谈协程
- 线程和进程的区别是什么?
- 线程安全问题探讨
- Why are most UI frameworks single threaded?
- RxJava 线程切换原理
- Kotlin 协程真的比 Java 线程更高效吗?
- 《深入理解Kotlin协程》 霍丙乾著