我正在尝试在一个Android应用程序中尝试Kotlin Coroutines,特别是我已经导入了Kotlin Coroutine Adapter for Retrofit。
Kotlin协程适配器更改Retrofit接口以返回Deferred<T>
而不是Call<T>
。
我不了解如何在想要的特定Deferred
中启动此CoroutineContext
。考虑以下代码:
class MyViewModel @Inject constructor(
private val foo: Foo,
@Named("ui") private val uiContext: CoroutineContext,
@Named("network") private val networkContext: CoroutineContext
) : ViewModel() {
fun performSomeJob(param: String) {
launch(uiContext) {
try {
val response = foo.bar(param).await()
myTextView.setText(response.name)
} catch (error: Throwable) {
Log.e(error)
}
}
}
foo.bar(param)
返回Deferred<SomeModel>
的地方。
此代码有效,但是我不确定执行此CoroutineContext
的{{1}}(foo.bar(param)
??)。
如何明确指定我希望CommonPool
在foo.bar(param)
中执行?
networkContext
此代码不起作用,因为
val response = async(networkContext) { foo.bar(param) }.await()
的计算结果是response
,而不是Deferred<SomeModel>
(我要实现)。
答案 0 :(得分:1)
foo.bar()
调用不会启动另一个协程,它仅包装本机Retrofit Call
,以便其状态更改传播到Deferred
。 Retrofit管理自己的线程以执行其操作,这就像没有协程包装程序时一样。如果您有特定的问题,可以通过以通常的方式配置Retrofit来解决。
唯一重要的是协程正在UI上下文中执行。