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!
Поделиться публикацией
Ой, у вас баннер убежал!

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

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


          • во-первых, события обрабатываются синхронно или асинхронно?
          • отсылка нового сообщения изнутри хендлера обрабатывается сразу же или ставится в очередь и обрабатывается по завершении текущего сообщения?
          • при создании новой подписки изнутри текущего хендлера на это же сообщение будет ли обрабатываемое сообщение переслано новому хендлеру?
          • если из текущего хендлера я отписываю другой хендлер, который должен будет обработать данное событие, будет ли ему послано текущее событие после такой отписки?
          • как поведет себя EventBus если я два раза вызову subscribe с одиними и теми же параметрами?
          • при возникновении исключительной ситуации внутри хендлера, будет ли сообщение доставлено другим хендлерам или же цепочка прервется?
          • можно ли один и тот же обработчик регистрировать для разных событий?

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

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