Warten darauf, dass die Coroutine ihren Job beendet, um ein Ereignis auszulösen [geschlossen]Android

Forum für diejenigen, die für Android programmieren
Anonymous
 Warten darauf, dass die Coroutine ihren Job beendet, um ein Ereignis auszulösen [geschlossen]

Post by Anonymous »

Ich habe eine Aktivität, die für die Erstellung eines neuen Eintrags in der Datenbank verantwortlich ist. In dieser Aktivität startet eine Schaltfläche eine Coroutine, um alle datenbankbezogenen Aufgaben zu erledigen. Wenn dies erledigt ist, navigieren Sie zu einer anderen Aktivität, in der Sie einen Überblick über Ihren Tresor erhalten.
Heute habe ich zum ersten Mal Erfahrungen mit Coroutinen gemacht, daher verstehe ich nicht wirklich, wie die Dinge funktionieren. Ich habe verschiedene Kombinationen ausprobiert, um Funktionen anzuhalten und nicht, in GlobalScope auszuführen, in Composable-fähigem Coroutine-Bereich usw. auszuführen. Das integrierte Gemini in Android Studio war wie immer eher ein Problem als ein Helfer.
Unten ist mein Code.
Die Schaltfläche:

Code: Select all

val localctx = LocalContext.current
val coroutineScope = rememberCoroutineScope()
Button(
onClick = {
var newEntryUuid = Uuid.random()
val newEntryUuidClone = newEntryUuid
coroutineScope.launch(Dispatchers.IO) {
if (newEntryViewModel.selectedEntryType == EntryTypes.Card)
newEntryUuid = newEntryViewModel.pushNewEntry(card = newEntryViewModel.createCard(), context =  localctx)
if (newEntryViewModel.selectedEntryType == EntryTypes.Account)
newEntryUuid = newEntryViewModel.pushNewEntry(account = newEntryViewModel.createAccount(), context = localctx)
newEntryViewModel.entryCreated.value = newEntryUuid != newEntryUuidClone
}
},
enabled = newEntryViewModel.allRequiredFieldsAreFilled,
colors = ButtonColors(
containerColor = MaterialTheme.colorScheme.primaryContainer,
contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
disabledContainerColor = Color.LightGray,
disabledContentColor = Color.DarkGray
),
modifier = Modifier
.fillMaxWidth()
.padding(top = 16.dp)
) {
Text(stringResource(R.string.continue_button))
}
Spacer(
modifier = Modifier.height(80.dp)
)
}
Die pushNewEntry-Funktionen:

Code: Select all

@OptIn(DelicateCoroutinesApi::class)
suspend fun pushNewEntry(account: Account, context: Context): Uuid {
return withContext(Dispatchers.IO) {
val database = DatabaseProvider.getDatabase(context)

val newAccUuid = AccountManager.createAccount(
database = database,
account = account,
encryptionKey = VaultHandler().getEncryptionKey(context)
)

if (selectedFolderUuid != null) {
FolderManager.performEntryFolderOper(
database = database,
operation = FolderManager.EntryFolderOperations.Add,
entryUuid = newAccUuid,
targetFolderUuid = selectedFolderUuid as Uuid
)
}

newAccUuid
}
}
// the very same thing but with a card type
Es tut mir sehr leid für die Ablenkung einiger, die ich vielleicht angesprochen habe >:3 Das Problem lag NICHT hier. Dieser Code funktioniert einwandfrei. Mein Problem lag bei den Composables. Ich habe Standard-Kotlin-Variablen und keine mutableStates verwendet, daher hat Composables nicht angezeigt, was ich in die Datenbank eingegeben habe. Also habe ich 4 Stunden damit verbracht, einem nicht existierenden Problem nachzujagen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post