How to get value from LiveData synchronously?

With Kotlin coroutines

callbackFlow {
    val observer = Observer<Unit> {
        trySend(Unit)
    }
    MutableLiveData<Unit>().also {
        it.observeForever(observer)
        awaitClose {
            it.removeObserver(observer)
        }
    }
}.buffer(Channel.Factory.CONFLATED)
    .flowOn(Dispatchers.Main.immediate)
// e.g. single()

You can call getValue() to return the current value, if there is one. However, there is no "block until there is a value" option. Mostly, that is because LiveData is meant to be consumed on the main application thread, where indefinitely-blocking calls are to be avoided.

If you need "block until there is a value", use RxJava and ensure that you are observing on a background thread.