簡體   English   中英

官方協程指南中的 Dispatchers.IO 或 Dispatchers.Main

[英]Dispatchers.IO or Dispatchers.Main in official coroutines guide

此處的 Android 官方協程指南中,有兩個代碼示例。 在第一個示例中,從 fetchDocs() 調用的 function get(url: String) 在 Dispatchers.IO 上運行,但在第二個示例中它在 Dispatchers.Main 上運行 - 請參閱每個示例中的第二條評論。 這是一個錯誤,還是它們實際上運行在不同的 Dispatcher 上?

第一個例子

suspend fun fetchDocs() {                             // Dispatchers.Main
    val result = get("https://developer.android.com") // Dispatchers.IO for `get`
    show(result)                                      // Dispatchers.Main
}

suspend fun get(url: String) = withContext(Dispatchers.IO) { /* ... */ }

第二個例子

suspend fun fetchDocs() {                      // Dispatchers.Main
    val result = get("developer.android.com")  // Dispatchers.Main
    show(result)                               // Dispatchers.Main
}

suspend fun get(url: String) =                 // Dispatchers.Main
    withContext(Dispatchers.IO) {              // Dispatchers.IO (main-safety block)
        /* perform network IO here */          // Dispatchers.IO (main-safety block)
    }                                          // Dispatchers.Main
}

我認為本文作者的意圖是簡化第一個示例,以表明我們可以輕松地逐行切換線程。 在這兩個示例中, get()都是使用Dispatchers.Main執行的,但它會立即跳轉到Dispatchers.IO ,因此為簡單起見,它被標記為IO 該文檔甚至提到:

在這個例子中,get() 仍然在主線程上運行 (...)

無論如何,我同意這可能會讓讀者感到困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM