嗨,我是協程的初學者,但我有一些問題......
我有兩個不同的代碼,第一個使用withContext(Dispatchers.IO),第二個不使用。
這兩個代碼有什么區別?
為什么他們有相同的結果?
每個代碼如何逐行作業?
在協程中學習一切的技巧。
- 第一個代碼
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
GlobalScope.launch(Dispatchers.IO) {
print("aly")
print("younes")
}
}
suspend fun print(name:String) {
withContext(Dispatchers.IO) {
delay(2000)
Log.d("younes3", name)
}
}
}
- 第二個代碼
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
GlobalScope.launch(Dispatchers.IO) {
print("aly")
print("younes")
}
}
suspend fun print(name:String) {
delay(2000)
Log.d("younes3", name)
}
}
- 第一個代碼
2022-11-13 10:28:02.122 21136-21176 younes3 com.example.coroutines1 D aly
2022-11-13 10:28:04.124 21136-21178 younes3 com.example.coroutines1 D younes
- 第二個代碼
2022-11-13 10:28:26.511 21286-21326 younes3 com.example.coroutines1 D aly
2022-11-13 10:28:28.512 21286-21328 younes3 com.example.coroutines1 D younes
uj5u.com熱心網友回復:
你的問題很不集中,所以我將重點關注Dispatchers.IO它的作用以及為什么你的代碼在有或沒有它的情況下完全一樣。
作為一般規則,我們不應該在使用協程時執行任何阻塞 I/O 操作。InputStream這意味著在使用諸如阻塞之類的實用程式時讀取/寫入檔案或網路。在協程內部阻塞可能會極大地降低使用協程的整個應用程式的性能和回應能力。
但是,永遠不會執行任何阻塞 I/O 是非常困難的。出于這個原因,Kotlin 協程框架提供了一個實用程式,該實用程式允許通過在非常特殊的背景關系中執行來阻塞 I/O - 這是Dispatchers.IO. 在內部,它將阻塞操作調度到專門為此目的設計的特殊執行緒池。
您看不到兩個代碼示例之間的任何區別,因為GlobalScope.launch(Dispatchers.IO)已經使用Dispatchers.IO. print()已經使用呼叫Dispatchers.IO了,所以附加withContext(Dispatchers.IO)不會做任何事情。
我建議Dispatchers.IO只在直接處理阻塞 I/O 的代碼中切換到。如果我們的代碼只呼叫其他掛起函式,我們通常不應該切換到這個調度程式,即使這些函式與 I/O 操作有某種關聯。因此,您不應使用Dispatchers.IOin GlobalScope.launch()。
此外,print()代碼中的函式也不會執行任何阻塞 I/O,因此事實上,您也應該洗掉withContext()。如果這只是一個示例,并且您要在內部執行阻塞 I/O print(),那么您應該withContext(Dispatchers.IO)在那里使用,但仍然不能在onCreate().
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/532098.html
標籤:安卓科特林kotlin 协程
下一篇:如何將文本與元素的開頭對齊
