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学习知识点的主要内容,如果未能解决你的问题,请参考以下文章

“临界知识”的3个底层思维与方法,98%的人都不知道!

转:学习笔记:delphi多线程学识

掌握这些知识,你的认知将提升一个档次

Kotlin学习知识点

Kotlin学习知识点

勤奋的杨老师