Skip to content

Instantly share code, notes, and snippets.

@douo
Last active November 24, 2018 02:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save douo/30d38e6400279421ed9fdb51e307e9ab to your computer and use it in GitHub Desktop.
Save douo/30d38e6400279421ed9fdb51e307e9ab to your computer and use it in GitHub Desktop.
package info.dourok.androidx.databinding
import androidx.databinding.ViewDataBinding
import androidx.lifecycle.GenericLifecycleObserver
import androidx.lifecycle.Lifecycle.Event.ON_START
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
import java.lang.ref.WeakReference
import java.util.WeakHashMap
val weakHashMap = WeakHashMap<ViewDataBinding, LifecycleObserver>()
/**
* quick and dirty fix for https://issuetracker.google.com/issues/73857743
* uses `binding.fxxk(owner)` replace of `binding.setLifecycleOwner(owner)`
*/
inline fun <reified T : ViewDataBinding> T.fxxk(owner: LifecycleOwner) {
setLifecycleOwner(owner)
val weakBinding = WeakReference(this)
if(weakHashMap.containsKey(this)){
weakHashMap[this]?.let { owner.lifecycle.removeObserver(it) }
}
owner.lifecycle.addObserver(GenericLifecycleObserver { _, event ->
if (weakBinding.get() != null) {
val binding = weakBinding.get()!!
if (event == ON_START) {
ViewDataBinding::class.java.getDeclaredField("mPendingRebind").let {
synchronized(binding) {
it.isAccessible = true
if (it.get(binding) as Boolean) {
it.set(binding, false)
}
}
}
}
}
}.also {
weakHashMap[this] = it
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment