笔记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")

相关推荐
Kapaseker14 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
A0微声z3 天前
Kotlin Multiplatform (KMP) 中使用 Protobuf
kotlin
alexhilton3 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
lhDream3 天前
Kotlin 开发者必看!JetBrains 开源 LLM 框架 Koog 快速上手指南(含示例)
kotlin
RdoZam3 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
Kapaseker4 天前
研究表明,开发者对Kotlin集合的了解不到 20%
android·kotlin
糖猫猫cc4 天前
Kite:两种方式实现动态表名
java·kotlin·orm·kite
如此风景5 天前
kotlin协程学习小计
android·kotlin
Kapaseker5 天前
你搞得懂这 15 个 Android 架构问题吗
android·kotlin
zh_xuan5 天前
kotlin 高阶函数用法
开发语言·kotlin