diff --git a/binding/src/main/java/androidx/lifecycle/BindingLifecycleObserver.kt b/binding/src/main/java/androidx/lifecycle/BindingLifecycleObserver.kt new file mode 100644 index 0000000..28204c5 --- /dev/null +++ b/binding/src/main/java/androidx/lifecycle/BindingLifecycleObserver.kt @@ -0,0 +1,31 @@ +package androidx.lifecycle + +/** + *
+ *     author: dhl
+ *     date  : 2021/1/25
+ *     desc  :
+ * 
+ */ + +open class BindingLifecycleObserver : FullLifecycleObserver { + + override fun onCreate(owner: LifecycleOwner) { + } + + override fun onStart(owner: LifecycleOwner) { + } + + override fun onResume(owner: LifecycleOwner) { + } + + override fun onPause(owner: LifecycleOwner) { + } + + override fun onStop(owner: LifecycleOwner) { + } + + override fun onDestroy(owner: LifecycleOwner) { + } + +} \ No newline at end of file diff --git a/binding/src/main/java/com/hi/dhl/binding/base/ActivityDelegate.kt b/binding/src/main/java/com/hi/dhl/binding/base/ActivityDelegate.kt index 70d1768..b57ff6b 100644 --- a/binding/src/main/java/com/hi/dhl/binding/base/ActivityDelegate.kt +++ b/binding/src/main/java/com/hi/dhl/binding/base/ActivityDelegate.kt @@ -7,8 +7,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentActivity import androidx.viewbinding.ViewBinding import com.hi.dhl.binding.LifecycleFragment -import com.hi.dhl.binding.addObserver -import com.hi.dhl.binding.registerActivityLifecycleCallbacks +import com.hi.dhl.binding.observerWhenDestroyed import kotlin.properties.ReadOnlyProperty /** @@ -28,10 +27,10 @@ abstract class ActivityDelegate( init { when (activity) { - is ComponentActivity -> activity.lifecycle.addObserver { destroyed() } + is ComponentActivity -> activity.lifecycle.observerWhenDestroyed { destroyed() } else -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - activity.registerActivityLifecycleCallbacks { destroyed() } + activity.observerWhenDestroyed { destroyed() } } } } diff --git a/binding/src/main/java/com/hi/dhl/binding/base/DialogDelegate.kt b/binding/src/main/java/com/hi/dhl/binding/base/DialogDelegate.kt index c657e48..afc022d 100644 --- a/binding/src/main/java/com/hi/dhl/binding/base/DialogDelegate.kt +++ b/binding/src/main/java/com/hi/dhl/binding/base/DialogDelegate.kt @@ -3,7 +3,7 @@ package com.hi.dhl.binding.base import android.app.Dialog import androidx.lifecycle.Lifecycle import androidx.viewbinding.ViewBinding -import com.hi.dhl.binding.addObserver +import com.hi.dhl.binding.observerWhenDestroyed import kotlin.properties.ReadOnlyProperty /** @@ -20,7 +20,7 @@ abstract class DialogDelegate( protected var viewBinding: T? = null init { - lifecycle?.addObserver { destroyed() } + lifecycle?.observerWhenDestroyed { destroyed() } } fun destroyed() { diff --git a/binding/src/main/java/com/hi/dhl/binding/base/FragmentDelegate.kt b/binding/src/main/java/com/hi/dhl/binding/base/FragmentDelegate.kt index a9ab77d..b19a764 100644 --- a/binding/src/main/java/com/hi/dhl/binding/base/FragmentDelegate.kt +++ b/binding/src/main/java/com/hi/dhl/binding/base/FragmentDelegate.kt @@ -2,7 +2,8 @@ package com.hi.dhl.binding.base import androidx.fragment.app.Fragment import androidx.viewbinding.ViewBinding -import com.hi.dhl.binding.addObserver +import com.hi.dhl.binding.observerWhenCreated +import com.hi.dhl.binding.observerWhenDestroyed import kotlin.properties.ReadOnlyProperty /** @@ -19,7 +20,21 @@ abstract class FragmentDelegate( protected var viewBinding: T? = null init { - fragment.lifecycle.addObserver { destroyed() } + + /** + * 感谢 architecture-components-samples 提供的思路 + * + * 最原始的处理的方案 监听 Fragment 的生命周期,会存在 Fragment 和 Fragment 中的 View 生命周期不一致问题 + * 详情查看 [issue][https://github.com/hi-dhl/Binding/issues/15] + */ + fragment.lifecycle.observerWhenCreated { + fragment.viewLifecycleOwnerLiveData.observe(fragment) { viewOwner -> + viewOwner.lifecycle.observerWhenDestroyed { + destroyed() + } + } + } + } private fun destroyed() { diff --git a/binding/src/main/java/com/hi/dhl/binding/ext/LifecycleExt.kt b/binding/src/main/java/com/hi/dhl/binding/ext/LifecycleExt.kt index 12e7241..1f6177f 100644 --- a/binding/src/main/java/com/hi/dhl/binding/ext/LifecycleExt.kt +++ b/binding/src/main/java/com/hi/dhl/binding/ext/LifecycleExt.kt @@ -6,8 +6,8 @@ import android.app.Application import android.app.Fragment import android.os.Build import android.os.Bundle +import androidx.lifecycle.BindingLifecycleObserver import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner /** @@ -18,32 +18,42 @@ import androidx.lifecycle.LifecycleOwner * */ -fun Lifecycle.addObserver(destroyed: () -> Unit) { - addObserver(LifecycleObserver(this, destroyed)) +fun Lifecycle.observerWhenDestroyed(destroyed: () -> Unit) { + addObserver(LifecycleObserver(lifecycle = this, destroyed = destroyed)) } -class LifecycleObserver(var lifecycle: Lifecycle?, val destroyed: () -> Unit) : - LifecycleEventObserver { - override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { - val lifecycleState = source.lifecycle.currentState - if (lifecycleState == Lifecycle.State.DESTROYED) { - destroyed() - lifecycle?.apply { - removeObserver(this@LifecycleObserver) - lifecycle = null - } - } +fun Lifecycle.observerWhenCreated(create: () -> Unit) { + addObserver(LifecycleObserver(lifecycle = this, create = create)) +} + +class LifecycleObserver( + var lifecycle: Lifecycle?, + var destroyed: (() -> Unit)? = null, + var create: (() -> Unit)? = null +) : BindingLifecycleObserver() { + + override fun onCreate(owner: LifecycleOwner) { + create?.invoke() } + override fun onDestroy(owner: LifecycleOwner) { + destroyed?.invoke() + lifecycle?.apply { + removeObserver(this@LifecycleObserver) + lifecycle = null + } + create = null + destroyed = null + } } -fun Activity.registerActivityLifecycleCallbacks(destroyed: () -> Unit) { +fun Activity.observerWhenDestroyed(destroyed: () -> Unit) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { registerActivityLifecycleCallbacks(LifecycleCallbacks(destroyed)) } } -class LifecycleCallbacks(val destroyed: () -> Unit) : +class LifecycleCallbacks(var destroyed: (() -> Unit)? = null) : Application.ActivityLifecycleCallbacks { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { } @@ -64,15 +74,16 @@ class LifecycleCallbacks(val destroyed: () -> Unit) : } override fun onActivityDestroyed(activity: Activity) { - destroyed() + destroyed?.invoke() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { activity.unregisterActivityLifecycleCallbacks(this) } + destroyed = null } } class LifecycleFragment : Fragment { - lateinit var destroyed: () -> Unit + var destroyed: (() -> Unit)? = null constructor() @@ -83,6 +94,7 @@ class LifecycleFragment : Fragment { override fun onDestroy() { super.onDestroy() - destroyed() + destroyed?.invoke() + destroyed = null } }