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
}
}