Fixed
Status Update
Comments
il...@google.com <il...@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
jb...@google.com <jb...@google.com>
ap...@google.com <ap...@google.com> #3
yea i'll take it.
jb...@google.com <jb...@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.
br...@gmail.com <br...@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)
br...@gmail.com <br...@gmail.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
Version used: 2.1.0-alpha03
Devices/Android versions reproduced on: Pixel XL Android 9
If needed I'll build a sample project but it's a behavior I have on multiple project.
Assuming my app is a simple master list, that can navigate to a detail fragment.
It can receive firebase notification that will contains an id to an element of the list. I want that on notification click, it launch the detail fragment from graph.
Here's the code I use to generate the notification:
val notificationId = news.id.hashCode()
val pendingIntent = NavDeepLinkBuilder(context)
.setDestination(R.id.newsDetailFragment)
.setArguments(NewsDetailFragmentArgs(
.setGraph(R.navigation.nav_main)
.setComponentName(MainActivity::class.java)
.createPendingIntent()
val notification = NotificationCompat.Builder(context, "notifications")
.setSmallIcon(R.drawable.ic_notif)
.setContentTitle(news.title)
.setContentText(news.excerptToString)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build()
val manager = NotificationManagerCompat.from(context)
manager.notify(notificationId, notification)
This code works well, the notification goes to the detail, using back button, i can come back to main screen then exits.
Except that when I use the "recent apps" button of the phone and brings the app again, instead of starting to main list scren, it brings back the detail screen (and pressing back display main list, then exits, and we can do it again and again...)
The only way to clear the start intent is to relaunch the app from the launcher instead.
I found a 2016 stackoverflow post about deeplink but I think that things weren't as we expect them to work today.
I don't think this should be the normal behavior, but if this is not a bug because of how deep link works, can you at least hint a solution on the
Tell me if you need a full sample or a video I will update the post.