KDispatcher — легкий и удобный eventbus для повседневного использования

Здравствуйте, уважаемые коллеги, любители Kotlin

В своей первой статье я хочу рассказать вам об одной полезной библиотеке, которую я написал, исключительно на Kotlin, и активно поддерживаю и развиваю. Называется она, — KDispatcher. Предназначена для рассылки и подписки на уведомления между вашими компонентами кода. Вы можете использовать его в любом kotlin-проекте, будь то Android, Frontend, Backend или KotlinNative.

Основные преимущества:

  • Быстрая и простая подписка на события
  • Приоритетность вызовов функций-слушателей (callbacks)
  • Использование kotlin extension functions
  • Потоко-безопасность

Итак, чтобы использовать эту библиотеку у себя в проекте, вам необходимо подключить ее через Gradle:

implementation 'com.rasalexman.kdispatcher:kdispatcher:x.y.z'

или Maven:

<dependency>
  <groupId>com.rasalexman.kdispatcher</groupId>
  <artifactId>kdispatcher</artifactId>
  <version>x.y.z</version>
  <type>pom</type>
</dependency>

После этого, вы можете воспользоваться двумя способами:

1) Вызвать метод объекта:

KDispatcher.subscribe(eventName, ::listenerFunction, priority)

где, eventName — строковое название вашего события, на которое вы хотите подписаться; ::listenerFunction — функция, которая принимает один параметр типа Notification и может быть вида

(Notification<T>)->Unit

содержащий в себе объект ваших данных (data:T) и название события(eventName:String). Последний, не обязательный параметр, priority:Int — числовая переменная, для сортировки вызова ваших коллбэков (callback functions), так как вы можете подписать на одно событие сразу несколько слушателей. Чтобы передать событие вам необходимо вызвать метод:

KDispatcher.call(eventName:String, data:Any)

Так же вы можете отписываться от прослушивания событий, когда они вам больше не нужны, с помощью метода:

KDispatcher.unsubscribe(eventName:String, ::listenerFunction)

Все очень просто.

2) Второй способ это заимплементить ваши классы (слово конечно не очень, но надеюсь все поймут) от интерфейса IKDispatcher и вы сможете получить все функциональности событийного фреймворка, и даже больше, за счет kotlin extension functions. Ниже хочу привести небольшой пример использования этого интерфейса:


class MainActivity : AppCompatActivity(), IKDispatcher {

    private val eventListenerOne = this::eventOneHandler
    //...
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        scopeOperation()
    }
    private fun scopeOperation() {
        // подписываемся на события используя разные способы
        subscribe(EVENT_CALL_ONE, 3, eventListenerOne)
        subscribe(EVENT_CALL_ONE, 1, ::eventListenerTwo)
        subscribe(EVENT_CALL_ONE, 2, MyClass::eventListenerFour)
        // вызываем событие
        call(EVENT_CALL_ONE, "FIRST CALL FROM KDISPATCHER")
        
        /**
         * так же вы можете использовать lambda-выражения
         */
        val eventName = "LAMBDA_EVENT"
        subscribe<String>(eventName) { notification ->
            println("LAMBDA_EVENT HAS FIRED with event name ${notification.eventName} and data ${notification.data}")
            unsubscribe(notification.eventName)
        }
        
        call(eventName, "FIRST CALL CUSTOM LABDA EVENT")
    }
    
    fun eventOneHandler(notification:Notification<Any>) {
       println("eventOneHandler MY TEST IS COMING event = ${notification.eventName} AND data = ${notification.data}")
    }
}

Полный пример использования вы сможете найти по ссылке
KDispatcher на гитхабе

Спасибо, что дочитали до конца. Буду очень рад отзывам и помощи в развитие проекта.

Всем приятного кодинга на потрясающем языке KOTLIN!
Поделиться публикацией

Похожие публикации

Комментарии 11
    0
    EventBus не перестаёт быть антипаттерном, даже если написать его на Котлин.
      0
      вы сударь не совсем правы. иногда это очень даже паттерн
        0
        И когда же он «паттерн»?
          0
          а что такого «анти» в событийных методах?
          слоты/сигналы устроены приблизительно также.
          и если задуматься, все системы событий — это эвентбаз в том или ином виде
      0
      занятно недавно думал на эту тему. спасиба. похоже пригодится
        0
          0
          ну всеже моя бибилиотека немного про другое, это всеже больше про события
        +1

        Начинаем наш Quiz:


        • во-первых, события обрабатываются синхронно или асинхронно?
        • отсылка нового сообщения изнутри хендлера обрабатывается сразу же или ставится в очередь и обрабатывается по завершении текущего сообщения?
        • при создании новой подписки изнутри текущего хендлера на это же сообщение будет ли обрабатываемое сообщение переслано новому хендлеру?
        • если из текущего хендлера я отписываю другой хендлер, который должен будет обработать данное событие, будет ли ему послано текущее событие после такой отписки?
        • как поведет себя EventBus если я два раза вызову subscribe с одиними и теми же параметрами?
        • при возникновении исключительной ситуации внутри хендлера, будет ли сообщение доставлено другим хендлерам или же цепочка прервется?
        • можно ли один и тот же обработчик регистрировать для разных событий?
          0
          1) События обрабатываются синхронно, но так как внутри kotlin object то это потоко безопасный объект.
          2) Обрабатывается сразу же
          3) Тут все зависит указали ли вы приоритет вызова коллбэка для подписывамого события. если приоритет не указан то вызовется сначала первая функция слушателя а затем вторая которая находиться внутри первого.
          4) Не будет, вы же отписываете слушатель. (опять же вопрос приоритета, если у последней приортиет вызова больше то естественно она вызовется первой)
          5) Никак, он запишет только первый вызов, второй проигнорирует
          6) К сожалению в настоящий момент я исключения не обрабатываются, спасибо за пояснение. Цепочка прервется.
          7) Да можно
            0
            7) начиная с версии 0.1.7 можно подписыватсья на список событий в одном методе subscribeList(....)

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое