От новичка до гуру: Курсы программирования на CyberDuff

Корутина не запускается?

На основе этой функции post throttleFirst:

fun <T> throttleFirst(
    skipMs: Long = 700L,
    scope: CoroutineScope = viewModelScope,
    action: (T) -> Unit
): (T) -> Unit {
    var throttleJob: Job? = null
    return { param: T ->
        if (throttleJob?.isCompleted != false) {
            throttleJob = coroutineScope.launch {
                destinationFunction(param)
                delay(skipMs)
            }
        }
    }
}

Я использую это так:

Просмотреть

<Button
    android:onClick="@{viewModel.myClickListener}"
.../>

Модель представления:

fun myClickListener() = View.OnClickListener { _ ->
    throttleClick(clickAction = {
        //do things
    })
}

Базовая модель:

protected fun throttleClick(millis: Long = 700L, clickAction: (Unit) -> Unit): (Unit) -> Unit  {
    throttleFirst(millis, scope = viewModelScope, action = clickAction)
}

Но ничего не происходит, clickAction не достигается. Во время отладки пошаговое выполнение завершается, когда достигает return { param: T ->, и эта возвращающая функция (throttleJob?.isCompleted... код) никогда не вызывается.
Что я делаю неправильно?

EDIT с помощью Patrick окончательное решение:

Модель представления

private val myThrottleClick = throttleClick(clickAction = {
    //do things
})

fun myClickListener() = View.OnClickListener { myThrottleClick(Unit) }

Базовая модель

protected fun throttleClick(millis: Long = 700L, clickAction: (Unit) -> Unit): (Unit) -> Unit {
    return throttleFirst(millis, action = clickAction)
}

  • что ты нажимаешь? 19.12.2019
  • Сообщение @coroutineDispatcher обновлено. Используется внутри Button из xml. Я использую Data Binding 19.12.2019
  • я думаю, что возвращаемый тип throttleFirst(...) является ссылкой на функцию (лямбда). вы должны где-то в своем коде вызвать его. throttleFirst(..).invoke() 19.12.2019

Ответы:


1

Ваша функция throttleFirst создает прослушиватель кликов, поэтому вы должны хранить ее в val за пределами области прослушивания кликов. то есть

val clickListener = throttleFirst { doStuff() }

fun myClickListener() = View.OnClickListener { _ -> clickListener() }

Возможно, вы сможете полностью отказаться от функции myClickListener и просто сослаться на clickListener в xml.

19.12.2019
  • Хорошо, понял, только одного не хватает, clickListener() запрашивает у меня параметр. Я хотел бы использовать Unit, но не могу создать экземпляр void, так как же вы предлагаете решить эту незначительную деталь? 20.12.2019
  • Вы можете удалить параметр из clickAction. щелкнитеДействие: () -> Единица измерения. В качестве альтернативы вы можете передать Unit в качестве параметра. 20.12.2019
  • Я буду использовать второй подход, потому что я не хочу менять функцию throttleFirst, а вместо этого создам прокси/помощник throttleClick для ее использования. Тем не менее, следует следовать второму подходу :) Я был глуп, потому что вызывал clickListener(Unit()) вместо clickListener(Unit)... ^^ Большое спасибо, Патрик! 20.12.2019
  • Новые материалы

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

    Игра в прятки с данными
    Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

    «Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
    TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

    Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
    Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

    Все о кейсах: Camel, Snake, Kebab & Pascal
    В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..

    Как работает дистанционное парное программирование и почему оно может изменить вашу жизнь
    Серебряная пуля от одиночества и отвлекающих факторов во время обучения программированию Независимо от того, работаете ли вы или учитесь удаленно, велика вероятность, что одиночество и..

    🔥🔥👉Питон 🆚Javascript👈🔥🔥
    Сегодня Python и Javascript потрясают мир в области ИТ. Все хотят выучить Python и Javascript, чтобы получить высокооплачиваемую работу. Различные фреймворки Python и Javascript расширяют..