Заменить обратные вызовы Kotlin Coroutine на Android - PullRequest
0 голосов
/ 19 марта 2019

Как я могу заменить мои обратные вызовы на сопрограммы?Возможно?Я попытался заменить событие onclick элемента адаптера с помощью suspendCoroutine:

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

И при активности:

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

Проблема заключается в том, что я могу вызвать waitForButtonClick только один раз, поскольку возобновление можетисполняться только один раз.Как заменить onClickCallback сопрограммой Kotlin?

1 Ответ

0 голосов
/ 20 марта 2019

проблема в том, что вызов 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)
}
...