代码之家  ›  专栏  ›  技术社区  ›  azizbekian

协同程序:对特定的协同程序文本运行延迟

  •  1
  • azizbekian  · 技术社区  · 6 年前

    我在一个Android应用程序中尝试Kotlin协同工作,特别是我导入的 Kotlin Coroutine Adapter for Retrofit .

    Kotlin协程适配器更改改装接口以返回 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> .

    这段代码有效,但我不确定 协同文本 食物棒(参数) 正在执行( CommonPool ??).

    如何明确指定 食物棒(参数) 在一个 networkContext ?

    
        val response = async(networkContext) { foo.bar(param) }.await()
    
    

    这段代码不起作用,因为 response 被评估为 推迟<SomeModel> 而不是 SomeModel (我想实现)。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Marko Topolnik    6 年前

    这个 foo.bar() call没有启动另一个协同程序,它只是包装了本机改造 Call 使其状态更改传播到 Deferred . reformation管理自己的线程来执行其操作,其工作方式与不使用协程包装器时一样。如果您有一个特定的问题,您可以通过以通常的方式配置改装来管理它。

    唯一对您重要的是,您的协同程序是在UI上下文中执行的。