Skip to content

Commit f0af25a

Browse files
author
Arkadii Ivanov
committed
Dispose UI Events subscription only on destroy
1 parent 7eac55e commit f0af25a

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

mvidroid/src/main/java/com/arkivanov/mvidroid/bind/BindUtils.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.arch.lifecycle.LifecycleOwner
55
import android.support.annotation.MainThread
66
import com.arkivanov.mvidroid.component.MviComponent
77
import com.arkivanov.mvidroid.view.MviView
8+
import io.reactivex.disposables.CompositeDisposable
89
import io.reactivex.disposables.Disposable
910

1011
/**
@@ -22,23 +23,25 @@ fun <UiEvent : Any, States : Any, Component : MviComponent<UiEvent, States>> bin
2223
component: Component,
2324
vararg bundles: MviViewBundle<States, *, out UiEvent>
2425
): MviLifecycleObserver {
25-
val disposables = ArrayList<Disposable>(bundles.size * 2)
26+
val onStopDisposables = ArrayList<Disposable>(bundles.size)
27+
val onDestroyDisposables = CompositeDisposable()
2628

2729
bundles.forEach {
28-
disposables.add(it.view.uiEvents.subscribe { component(it) })
30+
onDestroyDisposables.add(it.view.uiEvents.subscribe { component(it) })
2931
}
3032

3133
return object : MviLifecycleObserver {
3234
override fun onStart() {
33-
bundles.forEach { disposables.add(it.subscribe(component.states)) }
35+
bundles.forEach { onStopDisposables.add(it.subscribe(component.states)) }
3436
}
3537

3638
override fun onStop() {
37-
disposables.forEach(Disposable::dispose)
38-
disposables.clear()
39+
onStopDisposables.forEach(Disposable::dispose)
40+
onStopDisposables.clear()
3941
}
4042

4143
override fun onDestroy() {
44+
onDestroyDisposables.dispose()
4245
component.dispose()
4346
}
4447
}

mvidroid/src/test/java/com/arkivanov/mvidroid/bind/BindUtilsTest.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package com.arkivanov.mvidroid.bind
22

3-
import com.arkivanov.mvidroid.bind.MviViewBundle
4-
import com.arkivanov.mvidroid.bind.MviViewModelMapper
5-
import com.arkivanov.mvidroid.bind.bind
63
import com.arkivanov.mvidroid.component.MviComponent
74
import com.arkivanov.mvidroid.view.MviView
85
import com.jakewharton.rxrelay2.PublishRelay
@@ -49,6 +46,14 @@ class BindUtilsTest {
4946
verify(component)("event")
5047
}
5148

49+
@Test
50+
fun `component received event WHEN stopped AND view published`() {
51+
observer.onStart()
52+
observer.onStop()
53+
uiEventRelay.accept("event")
54+
verify(component)("event")
55+
}
56+
5257
@Test
5358
fun `view model not received by view WHEN emitted AND observer not started`() {
5459
viewModelRelay.accept("model")

0 commit comments

Comments
 (0)