Status Update
Comments
il...@google.com <il...@google.com>
il...@google.com <il...@google.com> #2
Process: work, PID: 7773
java.util.ConcurrentModificationException
at
androidx.compose.runtime.snapshots.StateListIterator.validateModification(SnapshotStateList.kt:297)
at androidx.compose.runtime.snapshots.StateListIterator.next(SnapshotStateList.kt:276)
at
.DashboardViewModel$getCarousalListApi$1$1$1.invokeSuspend(DashboardViewModel.kt:751)
at
.DashboardViewModel$getCarousalListApi$1$1$1.invoke(Unknown
Source:8)
at
.DashboardViewModel$getCarousalListApi$1$1$1.invoke(Unknown
Source:2)
at
.config.common.ExtensionsKt$launchOnIOWithCompletion$1.invokeSuspend(Extensions.kt:28)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:115)
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:103)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@5443283, Dispatchers.IO]
as...@gmail.com <as...@gmail.com> #3
reverse()
constructs two iterators (if the list is > 18 in size), one forward walking and one backwards walking and will modify the array using both iterators. This is currently treated as a concurrent modification as the array was modified after the iterator was created. This is too strict for the Java algorithms. They expect a concurrent modification exception to only be thrown if a structural chagne to the list is made, e.g. an insert or delete, not a value change.
First, mutableStateListOf()
lists will be changed to not interpret setting the value of the slot of an element as a concurrent. Second, they will be changed to support RandomAccess
which avoids the algorithms using the iterators for operations that would be faster if they used get
and set
directly.
ju...@gmail.com <ju...@gmail.com> #4
Branch: androidx-main
commit 75f720e1695c3574930d0385211341fac876a834
Author: Chuck Jazdzewski <chuckj@google.com>
Date: Thu Sep 14 15:22:33 2023
Relax concurrent modification exception for snapshot state list
The snapshot state list iterator considered any change made outside the
iterator as a concurrent change. This change relaxes the checking to
only consider structural changes (adding and removing) to be treated as
a concurrent change. This allows SnapshotStateList to be used with
`reverse()` which assumes that setting the value of an element is not a
concurrent change.
Adds RandomeAccess interface to MutableStateList to signal collection
extensions functions they can use direct indexing versions of their
algorithm.
Corrects the set() after a call previous() to update the correct
element.
Fixes: 219554654
Test: ./gradlew :compose:r:r:tDUT
Relnote: """SnapshotStateList is not marked as RandomAccess to enable
the direct indexing version of list helpers to be used"
Change-Id: I5210ca5c0f490619381ecf93ac0b1ccb03071e36
M compose/runtime/runtime/api/current.txt
M compose/runtime/runtime/api/restricted_current.txt
M compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/SnapshotStateList.kt
M compose/runtime/runtime/src/nonEmulatorCommonTest/kotlin/androidx/compose/runtime/snapshots/SnapshotStateListTests.kt
[Deleted User] <[Deleted User]> #5
[Deleted User] <[Deleted User]> #6
ro...@gmail.com <ro...@gmail.com> #7
Hi
re...@gmail.com <re...@gmail.com> #9
Drive way
je...@gmail.com <je...@gmail.com> #10
Hoka
hd...@gmail.com <hd...@gmail.com> #11 Restricted
ba...@gmail.com <ba...@gmail.com> #12
la...@gmail.com <la...@gmail.com> #14
Hi
sh...@gmail.com <sh...@gmail.com> #15
ap...@google.com <ap...@google.com> #16
Branch: androidx-master-dev
commit 790ebb8dfa2f0e5ffcfc41d88c2cf04288157e67
Author: Ian Lake <ilake@google.com>
Date: Thu Aug 23 10:50:43 2018
Move Fragment's view lifecycle to stopped
The Fragment's view lifecycle should be stopped
when the Fragment's lifecycle is stopped.
Moves the ON_CREATE event to after onViewStateRestored()
and ON_DESTROY event from onDestroyView()
to performDestroyView() to fully mirror the lifecycle.
Test: new testViewLifecycleInFragmentLifecycle() test
Fixes: 113070421
Change-Id: Id03d664fba627f7aab615b76d3e615496e88d6e2
M fragment/src/androidTest/java/androidx/fragment/app/FragmentViewLifecycleTest.java
M fragment/src/main/java/androidx/fragment/app/Fragment.java
Description
Version used: 28.0.0-rc01
Theme used: n/a
Devices/Android versions reproduced on: Pixel 2.0, Android 8.0
The sample app is an simple activity with a ViewPager of fragments for which each fragment is observing "TestLiveData" subclass of LiveData . When an instance of "TestLiveData" is observed with the fragment as its LifecycleOwner both LiveData.onActive()/onIsactive() is triggered if the app is foregrounded and backgrounded. However, if a Fragment.getViewLifecycleOwner() is provided to observe LiveData.onInactive() is never called.
Simply launch the sample app and notice the log output of "onActive()" and then push the app into the background. You will notice that there is no "onInactive" called. It is however called when cycling thru the ViewPager but shouldn't it be called when the app is backgrounded?