空指针安全
支持方法扩展
fun 类型.⽅法名(参数...):返回值{
}```
class Jump {
fun test() {
println("jump test")
//在被扩展的类中使用
doubleJump(1f)
}
}
fun Jump.doubleJump(howLong: Float): Boolean {
println("jump:$howLong")
println("jump:$howLong")
return true
}
Jump().doubleJump(2f)
//在被扩展类的外部使用
Jump().test()
KotlinExtensionKt.doubleJump(new Jump(), 2.0f);
### 协程
- **轻量**:您可以在单个线程上运行多个协程,因为协程支持[挂起](https://kotlinlang.org/docs/reference/coroutines/basics.html "挂起"),不会使正在运行协程的线程阻塞。挂起比阻塞节省内存,且支持多个并行操作。
- **内存泄漏更少**:使用[结构化并发](https://kotlinlang.org/docs/reference/coroutines/basics.html#structured-concurrency "结构化并发")机制在一个作用域内执行多项操作。
- **内置取消支持**:[取消](https://kotlinlang.org/docs/reference/coroutines/cancellation-and-timeouts.html "取消")操作会自动在运行中的整个协程层次结构内传播。
- **Jetpack 集成**:许多 Jetpack 库都包含提供全面协程支持的[扩展](https://developer.android.google.cn/kotlin/ktx?hl=zh_cn "扩展")。某些库还提供自己的[协程作用域](https://developer.android.google.cn/topic/libraries/architecture/coroutines?hl=zh_cn "协程作用域"),可供您用于结构化并发。
### 协程使用
// 协程构建器 主线程
GlobalScope.launch(Dispatchers.Main) {
//任务调度器 子线程
val user= withContext(Dispatchers.IO){
userServiceApi.User()
}
text.text="address:${user?.data?.get(0)?.category}"
}
}
- launch - 创建协程
- async - 创建带返回值的协程,返回的是 Deferred 类
- withContext - 不创建新的协程,指定协程上运行代码块
- runBlocking - 不是 GlobalScope 的 API,可以独立使用,区别是 runBlocking 里面的 delay 会阻塞线程,而 launch 创建的不会