Skip to content

Instantly share code, notes, and snippets.

@jknair0
Created July 2, 2019 08:52
Show Gist options
  • Select an option

  • Save jknair0/3c08aa880cd65f62ce3fc4124ff19f67 to your computer and use it in GitHub Desktop.

Select an option

Save jknair0/3c08aa880cd65f62ce3fc4124ff19f67 to your computer and use it in GitHub Desktop.
live data that emits only once i.e, events
package com.sensehawk.presentation
import android.arch.lifecycle.LifecycleOwner
import android.arch.lifecycle.MutableLiveData
import android.arch.lifecycle.Observer
import android.support.annotation.MainThread
import java.util.concurrent.atomic.AtomicBoolean
class EventLiveData<T> : MutableLiveData<T>() {
private val pending = AtomicBoolean(false)
private val observers = mutableSetOf<Observer<T>>()
private val internalObserver = Observer<T> { t ->
if (pending.compareAndSet(true, false)) {
observers.forEach { observer ->
observer.onChanged(t)
}
}
}
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<T>) {
observers.add(observer)
if (!hasObservers()) {
super.observe(owner, internalObserver)
}
}
override fun removeObservers(owner: LifecycleOwner) {
observers.clear()
super.removeObservers(owner)
}
override fun removeObserver(observer: Observer<T>) {
observers.remove(observer)
super.removeObserver(observer)
}
@MainThread
override fun setValue(t: T?) {
pending.set(true)
super.setValue(t)
}
@MainThread
fun call() {
value = null
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment