使用 Kotlin 协程改善 App 性能

0x0001 概述

协程是一种并发设计模式,您可以在 Android上 使用它来简化异步执行的代码。协程在 1.3 版中添加到 Kotlin,基于其他语言的既定概念进行设计 Kotlin 中的协程。

在Android上,协程可帮助解决两个主要问题:

  • 管理长时间运行的任务,这些任务可能会阻塞主线程并导致您的应用程序冻结。
  • 提供主安全性,或从主线程安全地调用网络或磁盘操作。

Read More

Jetpack 之 Android 组件 与 Kotlin 协程共同使用

0x0001 概述

Kotlin 协程提供了 API 以供开发者写出简单的异步代码。在 Kotlin 协程中,可以定义 CoroutineScope 作用域,它可以帮助开发者何时运行协程,每一个异步操作运行在特定的作用域内。

本主题说明如何协程如何与系统组件一起有效使用。

0x0002 添加组件的协程依赖

通过引入对应的 KTX 扩展包,来使用相应组件的内置 Kotlin 协程作用域,相应依赖如下:

1
2
3
4
5
6
// ViewModelScope
androidx.lifecycle:lifecycle-viewmodel-ktx:xxx
// LifeCycleScope
use androidx.lifecycle:lifecycle-runtime-ktx:xxx
// LiveData
androidx.lifecycle:lifecycle-livedata-ktx:xxx

Read More

Rxjava 源码学习(三):线程切换

根据官方文档的翻译:
subscribeOn 操作符指定 Observable 将在哪个线程上开始操作,无论该运算符在运算符链中的哪个点被调用。 ObserveOn 操作符影响下游 Observer 的运行线程,因此,可以在 Observable 操作符链中的各个点多次调用 ObserveOn,以更改某些运算符的运行线程。

Read More

Rxjava 源码学习(二):基本流程流程图

Rxjava 源码学习(一):基本流程分析 分析了基本流程,并且通过 Map 操作符一窥 Rxjava 操作符的特色,而本篇主体只有一张 Rxjava 流程图,但是这张流程图基本上可以概括 Rxjava 的框架,整个流程可以看做是一个 “横向 S” 模型。

该图共涉及 Rxjava 事件流的以下几个方面:

  1. Observable 的创建
  2. Observer 的创建、产生订阅关系
  3. 订阅关系的传递
  4. 取消订阅的流程

Read More

Kotlin 中的结构化并发是什么?

在接触到 Kotlin 的协程后,在官方文档知道,通过结构化的并发可以避免很多问题,具体参见官方文档 结构化的并发,但是什么是结构化的并发呢?通过搜索引擎没有查询到有用的信息。此处只是记录自己通过网上博客的学习,为自己现阶段的记录和理解,这个话题也会持续更新。

Kotlin 协程中如何实现结构化并发呢? 先看一下官方文档中是基于什么问题使用结构化的并发?首先看一下这段代码:

1
2
3
4
5
6
7
8
fun main() = runBlocking {
val job = GlobalScope.launch { // 启动一个新协程并保持对这个作业的引用
delay(1000L)
println("World!")
}
println("Hello,")
job.join() // 等待直到子协程执行结束
}

线程的启动总是全局的,一般是在程序的上下文启动的,对应协程,就如上面例子一样通过 GlobalScope 创建一个全局协程。不过官方文档上针对 GlobalScope 所阐述的确定,抱歉没看懂。。。

Read More

Kotlin协程学习(三):协程的非阻塞式挂起是什么?

Kotlin 协程的 非阻塞式挂起是什么?

什么事非阻塞式:不卡当前线程。

Kotlin 协程的非阻塞原因:

因为使用挂起函数会切换线程,既然切换了线程,那么肯定就不卡当前线程了。

其实线程也是非阻塞式的

线程中的阻塞式是 在单线程 下,在单线程下执行耗时操作是会阻塞线程的,如果在多线程情况下,那么此时的线程也是非阻塞式的。

Read More

Kotlin 协程官方文档学习(二)

1. 协程上下文和调度器

协程总是要运行在 CoroutineContext 类型为代表的协程上下文中,协程上下文是各种不同元素的集合,其中主元素为 Job,同事我们也会使用他的调度器。

2. 调度器与线程

协程上下文包括了一个协程调度器,它确定了协程执行时使用的一个或多个线程。协程调度器可以指定协程运行在指定线程,也可以调度它运行在线程池中或不受限的运行。

所有的协程构建器(比如:launch、async) 会接收一个可选的 CoroutineContext 参数,它可以被显示的为一个新的协程或其他上下文元素指定一个调度器。

Read More

Kotlin 协程官方文档学习(一)

1. 协程的基本介绍

协程,本质上是轻量级的线程。

它们在某些 CoroutineScope 上下文中launch 协程构建器 一起启动。

在 GlobalScope 中启动了一个新的协程,这意味着新协程的生命周期只受整个应用程序的生命周期限制。

delay 是挂起函数不会造成线程阻塞,但是会挂起协程,并且挂起函数只能在协程中使用。

2. 阻塞与非阻塞

阻塞与非阻塞都是针对于是否阻塞主线程来说的。

Read More