Skip to content

Instantly share code, notes, and snippets.

@ipcjs
Last active September 18, 2018 12:59
Show Gist options
  • Save ipcjs/e866c6bd5bbcd50a3396c693cdad41c1 to your computer and use it in GitHub Desktop.
Save ipcjs/e866c6bd5bbcd50a3396c693cdad41c1 to your computer and use it in GitHub Desktop.
package com.soling_ss.motorcycle.databinding
import android.arch.lifecycle.Lifecycle
import android.arch.lifecycle.LifecycleObserver
import android.arch.lifecycle.LifecycleOwner
import android.arch.lifecycle.OnLifecycleEvent
import android.databinding.ViewDataBinding
import com.soling_ss.motorcycle.util.FieldProperty
import com.soling_ss.motorcycle.util.writeOnly
import java.lang.ref.WeakReference
import kotlin.properties.Delegates
var ViewDataBinding.lifecycleOwner: LifecycleOwner? by Delegates.writeOnly { thisRef, value -> thisRef.setLifecycleOwner(value) }
/**see: [FuckLiveDataBinding]*/
var ViewDataBinding.lifecycleOwnerFuck: LifecycleOwner? by Delegates.writeOnly { binding, owner ->
val fuck = binding.fuck ?: FuckLiveDataBinding(binding).also { binding.fuck = it }
fuck.listen(owner)
}
// see: https://github.com/h0tk3y/kotlin-fun/blob/master/src/main/kotlin/com/github/h0tk3y/kotlinFun/FieldProperty.kt
private var ViewDataBinding.fuck: FuckLiveDataBinding? by FieldProperty { null }
class FuckLiveDataBinding(binding: ViewDataBinding) : LifecycleObserver {
private val bindingRef: WeakReference<ViewDataBinding?> = WeakReference(binding) // use WeakReference to prevent memory leaks
private var ownerRef: WeakReference<LifecycleOwner>? = null // ibid.
private inline val binding
get() = bindingRef.get()
private inline var owner
get() = ownerRef?.get()
set(value) {
ownerRef = if (value != null) WeakReference(value) else null
}
fun listen(newOwner: LifecycleOwner?) {
owner?.lifecycle?.removeObserver(this)
newOwner?.lifecycle?.addObserver(this)
if (newOwner == null) {
binding?.lifecycleOwner = null
}
owner = newOwner
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart(owner: LifecycleOwner) {
binding?.lifecycleOwner = owner
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop(owner: LifecycleOwner) {
binding?.lifecycleOwner = null
}
override fun toString(): String {
return "FuckLiveDataBinding(owner=$owner, binding=$binding)"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment