En Jetpack Compose, no existe el equivalente directo de runOnUiThread
como en las vistas tradicionales de Android. Jetpack Compose utiliza un modelo de programación reactivo y no tiene un hilo de interfaz de usuario (UI thread) explícito.
En su lugar, para realizar actualizaciones en la interfaz de usuario desde un contexto diferente al hilo principal, se pueden usar componentes específicos de Compose como LaunchedEffect
, DisposableEffect
o rememberCoroutineScope
para ejecutar código de manera segura en el hilo principal. Estos componentes están diseñados para interactuar con la interfaz de usuario de forma asincrónica y segura.
Aquí hay un ejemplo simplificado de cómo actualizar un valor en el hilo principal desde una corrutina en Jetpack Compose:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
package com.example.myapplication import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.example.myapplication.ui.theme.MyApplicationTheme import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MyApplicationTheme { // A surface container using the 'background' color from the theme Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { MyApp() } } } } } @Composable fun MyApp() { var text by remember { mutableStateOf("Initial Text") } val coroutineScope = rememberCoroutineScope() Column( modifier = Modifier .fillMaxSize() .padding(16.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Text(text) Button( onClick = { // Simular trabajo en un hilo secundario coroutineScope.launch(Dispatchers.Default) { delay(2000) // Simular una operación pesada // Actualizar la UI en el hilo principal después de la operación pesada // mediante el cambio de valor de 'text' text = "Updated Text" } } ) { Text("Update Text") } } } |