我知道协程不会阻塞线程,并且可以在执行工作时将线程委托给另一个协程。
我想知道为什么我不应该在带有 Dispatcher.Main 的协程中进行网络工作。
在进行网络工作时,您将能够执行其他与 UI 相关的任务,而不会阻塞主线程。
我的想法是,即使你可以把工作交给另一个协程,网络工作也会花费很长时间,结果是不是因为主线程有很多UI相关的工作要做,这使得浪费资源?
// works well
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
val service = RetrofitClient.buildService(GithubApiService::class.java)
val response = service.getIssues("JakeWharton", "hugo")
Log.d("TAG", " - response: $response")
}
}
@GET("/repos/{user}/{repo}/issues")
suspend fun getIssues(
@Path("user") user: String,
@Path("repo") repo: String
): List<Issue>
使用
Dispatchers.Main
调用 getIssues
挂起函数没有任何问题。使用什么调度程序来调用 suspend
函数并不重要,因为 suspend
函数不会阻塞(除非您自己通过在其中放入阻塞代码来错误地定义了挂起函数)。您只需避免在主线程上调用阻塞函数即可。
如果您定义了阻塞网络函数,那么如果您在主线程上调用它,它会冻结您的应用程序。