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

相关推荐
JMchen12314 小时前
Android CameraX深度解析:从Camera1到CameraX的相机架构演进
android·java·数码相机·架构·kotlin·移动开发·android-studio
倔强的石头10614 小时前
【Linux指南】进程控制系列(五)实战 —— 微型 Shell 命令行解释器实现
linux·运维·kotlin
Hz4531 天前
Android Jetpack核心组件协同实战:Navigation 3.X+Lifecycle+Flow+Hilt的架构革新
android·kotlin
JMchen1231 天前
Android音频编码原理与实践:从AAC到Opus,深入解析音频编码技术与移动端实现
android·经验分享·学习·kotlin·android studio·音视频·aac
JMchen1231 天前
Android音频处理全解析:从3A算法到空间音频,打造专业级音频体验
android·经验分享·算法·kotlin·android studio·音视频
瓦特what?2 天前
C++编程防坑指南(小说版)
android·c++·kotlin
一招定胜负2 天前
卷积神经网络提取人脸五个特征点
人工智能·cnn·kotlin
HeDongDong-2 天前
详解 Kotlin 的函数
开发语言·python·kotlin
zhangphil3 天前
Kotlin高阶函数及函数作为参数传递(2)
kotlin
Yang-Never3 天前
Open GL ES -> 应用前后台、Recent切换,SurfaceView纹理贴图闪烁问题分析解决
android·开发语言·kotlin·android studio·贴图