协程:在特定的CoroutineContext上运行Deferred

时间:2018-08-10 10:09:37

标签: android kotlin retrofit retrofit2 kotlin-coroutines

我正在尝试在一个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) ??)。

如何明确指定我希望CommonPoolfoo.bar(param)中执行?

networkContext

此代码不起作用,因为 val response = async(networkContext) { foo.bar(param) }.await() 的计算结果是response,而不是Deferred<SomeModel>(我要实现)。

1 个答案:

答案 0 :(得分:1)

foo.bar()调用不会启动另一个协程,它仅包装本机Retrofit Call,以便其状态更改传播到Deferred。 Retrofit管理自己的线程以执行其操作,这就像没有协程包装程序时一样。如果您有特定的问题,可以通过以通常的方式配置Retrofit来解决。

唯一重要的是协程正在UI上下文中执行。