官术网_书友最值得收藏!

Using a specific dispatcher when starting the coroutine

So far, we have seen how to create coroutines using async() and launch(), but in both cases we were using the default dispatcher. Consider the following code:

fun main(args: Array<String>) = runBlocking {
val task = launch {
printCurrentThread()
}
task.join()
}

Here, printCurrentThread(), as its name suggests, will just print the name of the current thread to the standard output:

fun printCurrentThread() {
println("Running in thread [${Thread.currentThread().name}]")
}

By running this code, we see that by default the coroutine will run in DefaultDispatcher, which as the time of writing is the same dispatcher as CommonPool – but be aware that this could change in the future.

If we update main() to create a CoroutineDispatcher the same way we did before, and send it to launch(), we will see that the coroutine is being executed in the thread that we indicated, for example:

fun main(args: Array<String>) = runBlocking {
val dispatcher = newSingleThreadContext(name = "ServiceCall")
val task = launch(dispatcher) {
printCurrentThread()
}
task.join()
}

The output looks like the following screenshot. Notice that the name of the thread is the same name that we set for the dispatcher:

Now we will do likewise in MainActivity:

private val dispatcher = newSingleThreadContext(name = "ServiceCall")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
launch(dispatcher) {
// TODO Call coroutine here
}
}
主站蜘蛛池模板: 水富县| 通辽市| 平凉市| 临高县| 神池县| 武胜县| 买车| 昌乐县| 饶阳县| 宣城市| 水富县| 南岸区| 会同县| 嘉峪关市| 五峰| 积石山| 霍邱县| 长岭县| 浦江县| 彭泽县| 冀州市| 大兴区| 略阳县| 巴塘县| 泸州市| 定陶县| 怀仁县| 明溪县| 霍林郭勒市| 安徽省| 新民市| 山阳县| 山东省| 景宁| 扬州市| 双柏县| 河曲县| 泰来县| 新龙县| 禄劝| 兖州市|