Kotlin - 挂起函数(1)- 简介

什么是挂起函数

用suspend关键字描述的函数,就是挂起函数,它具备挂起恢复能力。这么简单吗?没错,在Api层面确实是如此。必须在协程内或者其他suspend函数内执行。不够在底层逻辑层面就比较复杂,有兴趣的可以关注后续的原理分析。

什么是挂起恢复

将挂起函数的代码转移到别的线程执行,就是挂起;挂起函数执行完回来继续执行后续代码,就是恢复。是不是有点callBack的意思,没错,本质也就是回调。

到底挂起的是什么

当挂起函数的代码转移到别的线程执行,那么协程就暂停后续代码的执行,就有被挂起的是协程。

delay函数

是挂起函数,将协程挂起,该函数后的代码将延迟执行。

  • delay是非阻塞,不会阻塞线程,之所以是非阻塞,是靠挂起恢复实现的;
  • Thread.sleep 是阻塞的。
    以下代码,在主线程做测试,Dispatchers.Main指定协程在主线程执行,delay延迟10秒,但是协程外同样是在主线程的for循环任务以及点击事件不受影响。
    如果换成 Thread.sleep(10 * 1000),那么主线程的绘制、for循环任务以及点击事件都会收到影响。
        GlobalScope.launch(Dispatchers.Main) {
            delay(10 * 1000)//挂起线程,延迟执行后续操场
            if (Looper.getMainLooper() == Looper.myLooper()) {
                Log.i("test", "主线程");
            }
            Log.i("test", "Dispatchers.Main");
        }

        for (index in 0 until 1000) {//任务不会被堵塞
            Log.i("test", "$index");
        }

        testTv.setOnClickListener {//点击事件不会被堵塞
            Log.i("test", "setOnClickListener");
        }

以上分析有不对的地方,请指出,互相学习,谢谢哦!

你可能感兴趣的:(Kotlin - 挂起函数(1)- 简介)