什么是挂起函数
用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");
}
以上分析有不对的地方,请指出,互相学习,谢谢哦!
网友评论