【问题标题】:Replace callbacks by Kotlin Coroutine on Android在 Android 上用 Kotlin Coroutine 替换回调
【发布时间】:2019-03-19 18:26:26
【问题描述】:

如何用协程替换我的回调?这是可能的? 我尝试使用 suspendCoroutine 替换适配器项的 onclick 事件:

suspend fun waitForButtonClick() = suspendCoroutine<String> { continuation ->
    button.setOnClickListener {
        continuation.resume("My Data")
    }
}

关于活动:

GlobalScope.launch {
  val callbackResult = adapter.waitForButtonClick()
}

问题是我只能调用一次waitForButtonClick,因为resume只能执行一次。 如何用 Kotlin 协程替换 onClickCallback?

【问题讨论】:

  • 能否请您扩展使用示例?如果多次单击处理程序,您希望它如何工作?
  • 您可以将OnClickListener引用替换为您之后需要的引用,然后才能继续继续
  • 但是当我尝试调用 resume 时,协程会抛出一个错误,我只能调用 resume 一次

标签: android kotlin kotlin-coroutines


【解决方案1】:

问题是调用 setOnClickListener 会覆盖旧的监听器。

你可以使用这样的东西来收集挂起的功能:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    button.setOnClickListener(this::resumeSuspendedClickFunctions)
}

private val suspendedClickFunctions = LinkedList<View.OnClickListener>()

private fun resumeSuspendedClickFunctions(view: View){
    suspendedClickFunctions.forEach {
        it.onClick(view)
    }
    suspendedClickFunctions.clear()
}

suspend fun waitForButtonClick() = suspendCoroutine<String> { continuation ->
    val listener = View.OnClickListener {
        continuation.resume("My Data")
    }
    suspendedClickFunctions.add(listener)
}

【讨论】:

  • suspendedClickFunctions.forEach 如果从回调中添加了新的侦听器,则可能会产生 ConcurrentModificationException
猜你喜欢
  • 2020-05-06
  • 2020-07-29
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2022-01-16
  • 2019-10-08
相关资源
最近更新 更多