笔记kotlin注意的点

Kotlin 协程是一种轻量级的并发模型,用同步代码的写法实现异步逻辑,本质是基于挂起(suspend)和状态机,在不阻塞线程的情况下进行任务切换。

Kotlin 协程是一种基于挂起函数的轻量级并发方案,通过编译期状态机实现,在不阻塞线程的前提下进行任务调度,结合 Android 生命周期可以安全、高效地处理异步任务。

Q1:协程会不会阻塞线程?

不会,suspend 只是挂起协程,不会阻塞线程。


Q2:协程怎么取消?

通过 Job,并且协程是协作式取消,需要在挂起点检查。


Q3:协程和 RxJava 怎么选?

协程更适合顺序逻辑和生命周期管理,Rx 更适合复杂流式变换。

五、协程 vs 线程(必问)

对比项 线程 协程
创建成本 极低
切换成本 内核态 用户态
是否阻塞线程 不会
数量级 几百 几十万
生命周期管理

一句话总结:

线程是资源,协程是任务


fun main() = runBlocking {

println("main start thread=${Thread.currentThread().name}")

launch {

println("C1 start thread=${Thread.currentThread().name}")

delay(1000)

println("C1 after delay thread=${Thread.currentThread().name}")

}

launch {

println("C2 start thread=${Thread.currentThread().name}")

heavyWork() // 模拟耗时

println("C2 after heavyWork thread=${Thread.currentThread().name}")

}

println("main end")

}

suspend fun heavyWork() {

println("heavyWork start thread=${Thread.currentThread().name}")

Thread.sleep(2000)

println("heavyWork end thread=${Thread.currentThread().name}")

}

二、你先猜一下 Log 顺序(很重要)

先别往下看,你自己想一想:

delay(1000) 会不会挡住别的协程?

Thread.sleep(2000) 会不会?

三、真实打印顺序(标准答案)

text

复制代码

main start thread=main

main end

C1 start thread=main

C2 start thread=main

heavyWork start thread=main

heavyWork end thread=main

C2 after heavyWork thread=main

C1 after delay thread=main

这里Thread.sleep(2000)不会让出线程

✔ suspend ≠ 不执行

✔ delay ≠ 偷懒

✔ 协程 ≠ 消灭耗时

真正的分界线只有一条:

能不能在执行过程中"让出线程"


九、一句话面试必杀总结

你现在可以这样说(非常加分):

协程只能在挂起点让出线程,普通阻塞代码即使在协程里也会真实占用线程。

kotlin == ===

== 是比较值是否相等。相当于java里面的equel

=== 是比较是否为同一个对象而不仅仅是值是否相等,相当于java里面的==

kotlin 中的val和const以及 const val

val 是运行期常量,const val 是编译期常量,const 只能修饰 val,不能单独存在。

const x = 10 // ❌ 编译错误

const val TAG = "AppStoreActivity"

const val KEY_USER_ID = "user_id"

Java 中直接变成:

java

复制代码

public static final String TAG = "AppStoreActivity";

java和kotlin里面的?:

java里面?:是三目运算

int max = a > b ? a : b;

kotlin

表达式1 ?: 表达式2

含义:

如果 表达式1 != null → 返回它

如果 表达式1 == null → 返回表达式2

val name = user?.name ?: ""

等价 Java:

java

复制代码

String name = user != null ? user.getName() : "";

配合安全调用

kotlin

复制代码

val length = text?.length ?: 0

抛异常(Kotlin 惯用)

kotlin

复制代码

val user = intent.getParcelableExtra<User>("user")

?: throw IllegalArgumentException("user is null")

相关推荐
ai2work17 小时前
ch23 综合复刻:从零做一个最小可用版本(capstone)
kotlin
ai2work17 小时前
ch21 签名、校验与发版
kotlin
JMchen18 小时前
属性动画原理与高级动画实现
android·kotlin·canvas
Android打工仔18 小时前
Kotlin 协程源码解析:协程是如何切换线程的?
android·kotlin
ai2work20 小时前
附录 D 速查索引与阅读指南
kotlin
ai2work20 小时前
ch22 诊断方法论:三个真实事故的根因分析
kotlin
Kapaseker21 小时前
你有搞明白 Volatile 什么意思吗?
android·kotlin
alexhilton1 天前
藏在设备上的秘密,终究藏不住
android·kotlin·android jetpack
ai2work1 天前
ch15 加载模型与初始化上下文
kotlin
hai_android1 天前
Kotlin / Android 常用函数使用示例手册
android·java·kotlin