Fixed
Status Update
Comments
ve...@google.com <ve...@google.com>
ve...@google.com <ve...@google.com> #2
Yigit, do you have time to fix it?
reemission of the same liveData is racy
reemission of the same liveData is racy
il...@google.com <il...@google.com>
il...@google.com <il...@google.com>
jb...@google.com <jb...@google.com> #3
yea i'll take it.
ap...@google.com <ap...@google.com> #4
Thanks for the detailed analysis. This may not be an issue anymore since we've started using Main.immediate there but I' not sure; I'll try to create a test case.
ar...@gmail.com <ar...@gmail.com> #5
just emitting same live data reproduces the issue.
@Test
fun raceTest() {
val subLiveData = MutableLiveData(1)
val subject = liveData(testScope.coroutineContext) {
emitSource(subLiveData)
emitSource(subLiveData) //crashes
}
subject.addObserver().apply {
testScope.advanceUntilIdle()
}
}
@Test
fun raceTest() {
val subLiveData = MutableLiveData(1)
val subject = liveData(testScope.coroutineContext) {
emitSource(subLiveData)
emitSource(subLiveData) //crashes
}
subject.addObserver().apply {
testScope.advanceUntilIdle()
}
}
il...@google.com <il...@google.com> #6
With 2.2.0-alpha04 (that use Main.immediate), the issue seems to be still there (I tested it by calling emitSource() twice, like your test case)
ap...@google.com <ap...@google.com> #7
yea sorry immediate does not fix it.
I actually have a WIP fix for it:
https://android-review.googlesource.com/c/platform/frameworks/support/+/1112186
if your case is the one i found (emitting same LiveData multiple times, as shown in #5) you can work around it by adding a dummy transformation.
val subLiveData = MutableLiveData(1)
val subject = liveData(testScope.coroutineContext) {
emitSource(subLiveData.map {it })
emitSource(subLiveData.map {it} )
}
I actually have a WIP fix for it:
if your case is the one i found (emitting same LiveData multiple times, as shown in #5) you can work around it by adding a dummy transformation.
val subLiveData = MutableLiveData(1)
val subject = liveData(testScope.coroutineContext) {
emitSource(subLiveData.map {it })
emitSource(subLiveData.map {it} )
}
Description
proper behavior:
when replacing fragment on empty container, fragment is added
when replacing fragment on container with other fragment, the old fragment is removed from view and destroyed, new one is added
when removing fragment from container, fragment is removed and destroyed
observed behavior:
when replacing fragment on container with other fragment, old fragment is removed from view, but not destroyed, new one is added
The problem is with "double animation" - when container have animateLayoutChanges="true" and replacing fragments with animation (system or custom)
can this be fixed, so that i can have animation of showing fragment and animation of changing container size?
sample project to show the issue:
tested on Android 8.0
tested with build tools 28 and 27.0.3
tested on support libraries 27.1.1 and 28.0.0-RC02
in sample project there are two containers the fragments are replaced in in the same time, in one with animateLayoutChanges old fragment is not destroyed nor detached, in the one without layout changes old fragment is properly destroyed and detached