使用协程时,为什么网络工作不能在主线程上完成? (安卓)

问题描述 投票:0回答:1

我知道协程不会阻塞线程,并且可以在执行工作时将线程委托给另一个协程。

我想知道为什么我不应该在带有 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>
android kotlin kotlin-coroutines
1个回答
0
投票

使用

Dispatchers.Main
调用
getIssues
挂起函数没有任何问题。使用什么调度程序来调用
suspend
函数并不重要,因为
suspend
函数不会阻塞(除非您自己通过在其中放入阻塞代码来错误地定义了挂起函数)。您只需避免在主线程上调用阻塞函数即可。

如果您定义了阻塞网络函数,那么如果您在主线程上调用它,它会冻结您的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.