一、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 "網(wǎng)絡(luò)數(shù)據(jù)..."
}
二、阻塞型 runBlocking(不推薦)
這是一種不推薦的開啟協(xié)程的方式,因為這種會阻塞線程仇奶。啟動一個新的協(xié)程,并阻塞它的調(diào)用線程比驻,直到里面的代碼執(zhí)行完畢该溯。
其實在業(yè)務(wù)開發(fā)過程中,也沒有多少這種需求需要阻塞線程的别惦。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_coroutines)
val startTime = System.currentTimeMillis()
Log.d(TAG, "開始獲取網(wǎng)絡(luò)數(shù)據(jù)...time: $startTime")
runBlocking {
val text = getText()
Log.d(TAG, "網(wǎng)絡(luò)數(shù)據(jù)...$text time: ${System.currentTimeMillis() - startTime} currentThread:${Thread.currentThread().name}")
}
Log.d(TAG, "執(zhí)行完畢... time: ${System.currentTimeMillis() - startTime}")
}
private suspend fun getText(): String {
Thread.sleep(3000)
return "網(wǎng)絡(luò)數(shù)據(jù)..."
}
看日志分析:
很明顯狈茉,在主線程回調(diào),runBlocking 阻塞了線程掸掸。這是一種不推薦開啟協(xié)程的方式
其實這種方式氯庆,和不開啟協(xié)程是沒有去區(qū)別,因為上述功能直接寫在協(xié)程外面同樣阻塞主線程扰付。
當然堤撵,runBlocking 是可以指定線程,不過同樣會阻塞其依賴的線程