Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

482
Vistas
Alcance principal frente a alcance global

¿Cuál es la diferencia entre GlobalScope y MainScope?

 //Accessing data from Room GlobalScope.launch { v.tvStoreName.text = pfViewModel.getStoreName() pageDetails.pageNumber = currentPage pageDetails.pageSize = pageSize pfViewModel.getTransactions(pageDetails, toolbarBuilder?.getDate()!!) }

El GlobalScope a veces comete un error que es muy difícil de reproducir.

Excepción fatal: android.view.ViewRootImpl$CalledFromWrongThreadException: solo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas.

 MainScope().launch { var storeName = "" withContext(Dispatchers.Default) { storeName = pfViewModel.getStoreName() } v.tvStoreName.text = storeName }
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

¿Cuál es la diferencia entre GlobalScope y MainScope?

MainScope es un CoroutineScope que usa Dispatchers.Main dispatcher de forma predeterminada, que está vinculado al subproceso principal de la interfaz de usuario.

El GlobalScope es un CoroutineScope que no tiene despachador en su contexto de corrutina. Esto significa que las corrutinas lanzadas en este ámbito usarán el despachador Dispatchers.Default , que está respaldado por un grupo de subprocesos (dimensionado según la cantidad de núcleos de CPU que tenga).

GlobalScope tampoco tiene Job en su contexto, lo que significa que no se aplica la simultaneidad estructurada. Las corrutinas lanzadas en él nunca se cancelan automáticamente, por lo que deben controlarse manualmente. Es por esto que generalmente se desaconseja su uso a menos que tengas necesidades muy específicas.

Solo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas.

Este error se produce cuando intenta modificar las vistas desde fuera del subproceso principal, que es lo que sucede si lo hace desde corrutinas iniciadas en GlobalScope (porque está respaldado por un grupo de subprocesos separado).

En su segundo fragmento, está usando withContext(Dispatchers.Default) , que solo hace que esta parte del código se ejecute en ese grupo de subprocesos, pero el resto se ejecuta en el subproceso de la interfaz de usuario. Es por eso que la actualización de la interfaz de usuario está bien allí.

Tenga en cuenta que Room ya usa un despachador con un grupo de subprocesos en segundo plano para sus consultas, por lo que no necesita cambiar el contexto manualmente de esta manera, solo puede llamarlo desde el subproceso de la interfaz de usuario.

Nota al margen: usar MainScope().launch { .. } así es una mala idea, porque sufre el mismo problema de cancelación que GlobalScope . Para usarlo correctamente, deberá extraer este alcance en una variable/propiedad para poder cancelarlo cuando corresponda. Dicho esto, es más fácil usar un alcance existente. Android ya proporciona un ámbito de rutina listo para usar en componentes como Actividades que tienen un ciclo de vida (consulte la biblioteca lifecycle-runtime-ktx ). Se llama lifecycleScope . Debe lanzar sus rutinas en este ámbito para que se cancelen automáticamente cuando se destruya la actividad.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda