美文网首页
Kotlin: 协程学习笔记

Kotlin: 协程学习笔记

作者: 程序狮 | 来源:发表于2023-06-26 17:53 被阅读0次

    一、CoroutineScope (推荐)

        private fun testScope() {
            val coroutineScope = CoroutineScope(Dispatchers.Main)
            coroutineScope.launch(Dispatchers.IO) {
                val text = getText()
                coroutineScope.launch(Dispatchers.Main) {
                    tv1.text = text
                }
            }
        }
     
        private suspend fun getText(): String {
            Thread.sleep(3000)
            return "网络数据..."
        }
    

    二、阻塞型 runBlocking(不推荐)

    这是一种不推荐的开启协程的方式,因为这种会阻塞线程。启动一个新的协程,并阻塞它的调用线程,直到里面的代码执行完毕。
    其实在业务开发过程中,也没有多少这种需求需要阻塞线程的。

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_coroutines)
            val startTime = System.currentTimeMillis()
            Log.d(TAG, "开始获取网络数据...time: $startTime")
            runBlocking {
                val text = getText()
                Log.d(TAG, "网络数据...$text   time: ${System.currentTimeMillis() - startTime}  currentThread:${Thread.currentThread().name}")
            }
            Log.d(TAG, "执行完毕... time: ${System.currentTimeMillis() - startTime}")
        }
     
     
        private suspend fun getText(): String {
            Thread.sleep(3000)
            return "网络数据..."
        }
    

    看日志分析:

    image.png

    很明显,在主线程回调,runBlocking 阻塞了线程。这是一种不推荐开启协程的方式

    其实这种方式,和不开启协程是没有去区别,因为上述功能直接写在协程外面同样阻塞主线程。

    当然,runBlocking 是可以指定线程,不过同样会阻塞其依赖的线程

    相关文章

      网友评论

          本文标题:Kotlin: 协程学习笔记

          本文链接:https://www.haomeiwen.com/subject/uuxgydtx.html