client
使用翻新协程适配器。
我不明白,为什么我没有得到NetworkOnMainThreadException
?
是不是在主线程上调用了?
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val deferred = client.getStuffDeferred(file)
CoroutineScope(Dispatchers.Main).launch {
val response = deferred.await()
}
}
答案 0 :(得分:0)
使用 Retrofit Coroutines适配器,并且Retrofit函数返回Deffered
或Call
对象时,该请求将在工作线程(后台)中执行。在协程中调用标记为deferred.await()
的函数suspend
可以挂起协程,而不会阻塞UI线程。这意味着您可以等待请求完成并更新UI,而不会引发NetworkOnMainThreadException
异常:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val deferred = client.getStuffDeferred(file)
CoroutineScope(Dispatchers.Main).launch {
val response = deferred.await() // wait until request is executed in a background thread without blocking the Main Thread
// update UI
}
}
答案 1 :(得分:0)
如果您将协程上下文传递给协程生成器,则此类协程将使用该线程执行。
即
newSingleThreadContext
和newFixedThreadPoolContext
创建专用线程池。Executor
扩展功能将任意asCoroutineDispatcher
转换为调度程序。因此,使用类似:
CoroutineScope(Dispatchers.IO).launch { // we should use IO thread here !
}
答案 2 :(得分:0)
如果在Dispatchers.Main上调用launch,它将在主线程上运行,但会暂停执行以免阻塞线程。
因为您的CoroutineScope中没有挂起方法或runBlocking方法,所以此行为不会阻止或引发NetworkOnMainThreadException
但是: 您应该在进行网络操作或进行任何繁重的操作时更改上下文,使用
可能会减慢您的UI线程操作withContext(Dispatchers.IO){// your suspended calls}
,您可以将当前上下文更改为后台线程,并在主线程中继续工作而没有任何问题
在solution3上看看这个article 使用协程