@@ -17,7 +17,7 @@ import androidx.lifecycle.Lifecycle.State.RESUMED
1717import androidx.lifecycle.Lifecycle.State.STARTED
1818import androidx.lifecycle.LifecycleEventObserver
1919import androidx.lifecycle.LifecycleOwner
20- import io.reactivex.disposables.Disposable
20+ import io.reactivex.rxjava3. disposables.Disposable
2121
2222/* *
2323 * Dispose on corresponding lifecycle event.
@@ -46,7 +46,7 @@ fun <T : Disposable> T.disposeOnPause(activity: FragmentActivity): T = disposeOn
4646fun <T : Disposable > T.disposeOnDestroy (activity : FragmentActivity ): T = disposeOnLifecycleEvent(activity, ON_DESTROY )
4747
4848private fun <T : Disposable > T.disposeOnLifecycleEvent (activity : FragmentActivity , lifecycleEvent : Event ): T =
49- disposeOnLifecycleEvents(activity.lifecycle, listOf (lifecycleEvent, ON_DESTROY ))
49+ disposeOnLifecycleEvents({ activity.lifecycle }, { listOf (lifecycleEvent, ON_DESTROY ) } )
5050
5151/* *
5252 * Dispose on corresponding lifecycle event.
@@ -69,7 +69,7 @@ private fun <T : Disposable> T.disposeOnLifecycleEvent(activity: FragmentActivit
6969fun <T : Disposable > T.disposeOnLifecycle (fragment : Fragment ): T =
7070 disposeOnLifecycleEvent(fragment, when (fragment.viewLifecycleOrLifecycle.currentState) {
7171 INITIALIZED -> ON_DESTROY // onAttach, onCreate, onViewCreated
72- CREATED -> null // onCreateView: ON_DESTROY, onStart, onStop: ON_STOP
72+ CREATED -> if (fragment.viewLifecycleOwnerLiveData.value != null ) ON_STOP else null // onCreateView: ON_DESTROY, onStart, onStop: ON_STOP
7373 STARTED , RESUMED -> ON_PAUSE // onResume, onPause
7474 DESTROYED -> ON_DESTROY // onDestroyView, onDestroy
7575 })
@@ -79,45 +79,36 @@ fun <T : Disposable> T.disposeOnPause(fragment: Fragment): T = disposeOnLifecycl
7979fun <T : Disposable > T.disposeOnDestroy (fragment : Fragment ): T = disposeOnLifecycleEvent(fragment, ON_DESTROY )
8080
8181private fun <T : Disposable > T.disposeOnLifecycleEvent (fragment : Fragment , lifecycleEvent : Event ? ): T =
82- if (fragment.viewLifecycleOwnerLiveData.value != null ) {
83- val lifecycle = fragment.viewLifecycleOwner.lifecycle
84- // 1: In onStart, Fragment has view.
85- disposeOnLifecycleEvents(lifecycle, listOfNotNull(lifecycleEvent ? : /* 1 */ ON_STOP , ON_DESTROY ))
86- } else {
87- val lifecycle = fragment.lifecycle
88- when (lifecycle.currentState) {
89- INITIALIZED -> disposeOnLifecycleEvents(lifecycle, listOfNotNull(lifecycleEvent, ON_DESTROY ))
90- CREATED -> doOnLifecycleEvents(lifecycle, listOf (ON_START , ON_DESTROY )) {
91- if (fragment.viewLifecycleOwnerLiveData.value != null ) {
92- // 2: In onCreateView, Fragment has view.
93- // 2-1: If disposeOnPause/disposeOnStop/disposeOnDestroy called, dispose in lifecycleEvent
94- // 2-2: If disposeOnLifecycle called, dispose in onDestroyView
95- disposeOnLifecycleEvents(fragment.viewLifecycleOwner.lifecycle, listOfNotNull(/* 2-1 */ lifecycleEvent, /* 2-2 */ ON_DESTROY ))
96- } else {
97- // 3: In onStart, Fragment has no view.
98- // 3-1: If disposeOnPause/disposeOnStop/disposeOnDestroy called, dispose in lifecycleEvent
99- // 3-2: If disposeOnLifecycle called, dispose in onStop
100- // 4: In onStop, Fragment has no view.
101- // If disposeOnPause/disposeOnStop/disposeOnDestroy called, dispose in onDestroy
102- // If disposeOnLifecycle called, dispose in onDestroy
103- disposeOnLifecycleEvents(lifecycle, listOfNotNull(/* 3-1 */ lifecycleEvent ? : /* 3-2 */ ON_STOP , /* 4 */ ON_DESTROY ))
104- }
105- }
106- else -> disposeOnLifecycleEvents(lifecycle, listOfNotNull(lifecycleEvent, ON_DESTROY ))
107- }
108- }
82+ disposeOnLifecycleEvents(
83+ { fragment.viewLifecycleOrLifecycle },
84+ { listOf (lifecycleEvent ? : if (fragment.viewLifecycleOwnerLiveData.value != null ) ON_DESTROY else ON_STOP , ON_DESTROY ) }
85+ )
10986
11087private val Fragment .viewLifecycleOrLifecycle: Lifecycle
11188 get() = if (viewLifecycleOwnerLiveData.value != null ) viewLifecycleOwner.lifecycle else lifecycle
11289
113- private fun <T : Disposable > T.disposeOnLifecycleEvents (lifecycle : Lifecycle , lifecycleEvents : List <Event >): T =
114- if (lifecycle.currentState == DESTROYED ) safeDispose() else doOnLifecycleEvents(lifecycle, lifecycleEvents) { safeDispose() }
90+ private fun <T : Disposable > T.disposeOnLifecycleEvents (lifecycle : () -> Lifecycle , lifecycleEvents : () -> List <Event >): T =
91+ if (lifecycle() .currentState == DESTROYED ) safeDispose() else doOnLifecycleEvents(lifecycle, lifecycleEvents) { safeDispose() }
11592
116- private fun <T : Disposable > T.doOnLifecycleEvents (lifecycle : Lifecycle , lifecycleEvents : List <Event >, onEvent : T .() -> Unit ): T = this .also {
117- lifecycle.addObserver(object : LifecycleEventObserver {
93+ private fun <T : Disposable > T.doOnLifecycleEvents (
94+ lifecycle : () -> Lifecycle ,
95+ lifecycleEvents : () -> List <Event >,
96+ onEvent : T .() -> Unit
97+ ): T = this .also {
98+ lifecycle().addObserver(object : LifecycleEventObserver {
11899 override fun onStateChanged (source : LifecycleOwner , event : Event ) {
119- if (event in lifecycleEvents) {
120- lifecycle.removeObserver(this )
100+ if (event == ON_START ) {
101+ source.lifecycle.removeObserver(this )
102+ lifecycle().addObserver(object : LifecycleEventObserver {
103+ override fun onStateChanged (source : LifecycleOwner , event : Event ) {
104+ if (event in lifecycleEvents()) {
105+ source.lifecycle.removeObserver(this )
106+ onEvent()
107+ }
108+ }
109+ })
110+ } else if (event in lifecycleEvents()) {
111+ source.lifecycle.removeObserver(this )
121112 onEvent()
122113 }
123114 }
0 commit comments