Skip to content

Instantly share code, notes, and snippets.

@halcyonmobiledev
Created December 18, 2017 09:22
Show Gist options
  • Save halcyonmobiledev/cad6c912d7aaefd3004c7554dc60f420 to your computer and use it in GitHub Desktop.
Save halcyonmobiledev/cad6c912d7aaefd3004c7554dc60f420 to your computer and use it in GitHub Desktop.
/*
* Copyright (c) 2017 Halcyon Mobile
* http://www.halcyonmobile.com
* All rights reserved.
*/
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
/**
* A lifecycle-aware observable that sends only new updates after subscription, used for events like
* navigation and Snackbar messages.
* <p>
* This avoids a common problem with events: on configuration change (like rotation) an update
* can be emitted if the observer is active. This LiveData only calls the observable if there's an
* explicit call to setValue() or call().
* <p>
* Note that only one observer is going to be notified of changes.
*/
class SingleLiveEvent<T> : MutableLiveData<T>() {
private val pendingEvent = AtomicBoolean(false)
@MainThread override fun observe(owner: LifecycleOwner, observer: Observer<T>) {
// Observe the internal MutableLiveData
super.observe(owner, Observer<T> { t ->
if (pendingEvent.compareAndSet(true, false)) {
observer.onChanged(t)
}
})
}
@MainThread override fun setValue(t: T?) {
pendingEvent.set(true)
super.setValue(t)
}
/**
* Used for cases where T is Void, to make calls cleaner.
*/
@MainThread
fun call() {
value = null
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment