Use a SupervisorJob in BubbleDataRepository
Using a SupervisorJob ensures that if child coroutines
fail, the scope remains active and we can launch further
coroutines in it.
Also renamed the scope field to exclude io from it. Scopes
should be tied to lifetime of objects, not to dispatchers
Bug: 281083629
Test: Verified that bubbles are still persisted after adding
new bubbles and reordering them.
Change-Id: I38cc755d5496bfd636d8a4e26f93a26843b0508a
This commit is contained in:
@@ -33,6 +33,7 @@ import com.android.wm.shell.common.ShellExecutor
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
import kotlinx.coroutines.cancelAndJoin
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.yield
|
||||
@@ -45,7 +46,7 @@ internal class BubbleDataRepository(
|
||||
private val volatileRepository = BubbleVolatileRepository(launcherApps)
|
||||
private val persistentRepository = BubblePersistentRepository(context)
|
||||
|
||||
private val ioScope = CoroutineScope(Dispatchers.IO)
|
||||
private val coroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
|
||||
private var job: Job? = null
|
||||
|
||||
// For use in Bubble construction.
|
||||
@@ -131,7 +132,7 @@ internal class BubbleDataRepository(
|
||||
*/
|
||||
private fun persistToDisk() {
|
||||
val prev = job
|
||||
job = ioScope.launch {
|
||||
job = coroutineScope.launch {
|
||||
// if there was an ongoing disk I/O operation, they can be cancelled
|
||||
prev?.cancelAndJoin()
|
||||
// check for cancellation before disk I/O
|
||||
@@ -148,7 +149,7 @@ internal class BubbleDataRepository(
|
||||
* bubbles.
|
||||
*/
|
||||
@SuppressLint("WrongConstant")
|
||||
fun loadBubbles(userId: Int, cb: (List<Bubble>) -> Unit) = ioScope.launch {
|
||||
fun loadBubbles(userId: Int, cb: (List<Bubble>) -> Unit) = coroutineScope.launch {
|
||||
/**
|
||||
* Load BubbleEntity from disk.
|
||||
* e.g.
|
||||
|
||||
Reference in New Issue
Block a user