Kotlin学习知识点
Posted 刘兆贤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin学习知识点相关的知识,希望对你有一定的参考价值。
本文来自刘兆贤的博客_CSDN博客-Java高级,Android旅行,Android基础领域博主 ,引用必须注明出处!
Kotlin越来越流行,新的知识点和应用技巧,也十分吸引人,尤其是协程,其他还有规避回调的代码写法(类似RxJava)。
下面是经典写法,比较符合kotlin语法
class Test
public static long plus(int i1, int i2)
return i1 + i2;
public static void main(String[] args)
System.out.println(plus(1, 2));
class Test
interface Continuation
void next(int result);
public static void plus(int i1, int i2, Continuation continuation)
continuation.next(i1 + i2);
public static void main(String[] args)
plus(1, 2, result -> System.out.println(result));
协程,协助线程,而非代替线程。可以在单线程中使用,多线程同样可以,不需要切换到内核(有效降低线程上下文切换所浪费的时间),但需要遵循线程的临界条件,比如不能在主线程做网络请求等费时操作。
下面是顺序代码,无需回调,体现Kotlin的优雅。
launch(
val user = api.getUser() // 👈 网络请求(IO 线程),非阻塞式挂起,不影响后面操作
nameTv.text = user.name // 👈 更新 UI(主线程)
)
其中launch方法有3种
// 方法一,使用 runBlocking 顶层函数
runBlocking
getImage(imageId)
// 方法二,使用 GlobalScope 单例对象
// 👇 可以直接调用 launch 开启协程
GlobalScope.launch
getImage(imageId)
// 方法三,自行通过 CoroutineContext 创建一个 CoroutineScope 对象
// 👇 需要一个类型为 CoroutineContext 的参数
val coroutineScope = CoroutineScope(context)
coroutineScope.launch
getImage(imageId)
方法一,阻塞线程,通常用于单元测试,线上不用。
方法二,生命周期与APP一致,且不能取消,故不推荐。
方法三,推荐使用,其中lanch时,可加入IO/Main等类似RxJava线程类型。
coroutineScope.launch(Dispatchers.IO)
//切到IO线程,执行耗时操作
coroutineScope.launch(Dispatchers.Main)
//切到主线程,执行UI刷新操作
业务流程变成这样
coroutineScope.launch(Dispatchers.Main) // 开始协程:主线程
val token = api.getToken() // 网络请求:IO 线程
val user = api.getUser(token) // 网络请求:IO 线程
nameTv.text = user.name // 更新 UI:主线程
还有一个经典的withContext操作,执行结束返回原线程,避免切换线程的麻烦。
coroutineScope.launch(Dispatchers.Main) //在 UI 线程开始
val image = withContext(Dispatchers.IO) //切换到 IO 线程,并在执行完成后切回 UI 线程
getImage(imageId) //将会运行在 IO 线程
avatarIv.setImageBitmap(image) //回到 UI 线程更新 UI
其他两个等号判断值相等,三个等号判断引用相等。
问题:如何切换到内核?
参考:【码上开学】Kotlin 的协程用力瞥一眼 - 掘金破解 Kotlin 协程(6):协程挂起篇 | Bennyhuo
以上是关于Kotlin学习知识点的主要内容,如果未能解决你的问题,请参考以下文章