Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

350
Views
Habitación allowMainThreadQueries con rutinas Kotlin

La documentación oficial de Android establece que no se recomienda usar allowMainThreadQueries() porque podría bloquear la interfaz de usuario durante un largo período de tiempo y desencadenar un ANR. Pero las corrutinas de Kotlin nos dieron la posibilidad de realizar alguna operación en el subproceso principal sin bloquear efectivamente la interfaz de usuario.

Entonces pregunto: ¿es seguro usar allowMainThreadQueries() y acceder a la base de datos en un ámbito de rutina que se ejecuta en el hilo principal? Como en lo siguiente:

 // WITH allowMainThreadQueries() val activityJob = Job() val mainScope = CoroutineScope(Dispatchers.Main + activityJob) mainscope.launch { // access room database and retrieve some data // update UI with data retrived }

¿O deberíamos apegarnos a la forma antigua de no permitir consultas de subprocesos principales y realizar consultas de base de datos en otro subproceso?

 // WITHOUT allowMainThreadQueries() val activityJob = Job() val defaultScope = CoroutineScope(Dispatchers.Default + activityJob) val mainScope = CoroutineScope(Dispatchers.Main + activityJob) defaultScope.launch { // access room database and retrieve some data mainScope.launch { // update UI with data retrived } }

Lo pregunto por la forma anterior (con allowMainThreadQueries() ):

  • es mucho más legible (puedo actualizar la interfaz de usuario en el mismo contexto de rutina de las funciones que acceden a la base de datos, sin preocuparme por iniciar las actualizaciones de la interfaz de usuario en otro ámbito de rutina)
  • permite un manejo de errores más simple
  • hace uso de un solo ámbito de rutina (por lo que hay menos ámbitos de los que preocuparse)
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

No debería necesitar allowMainThreadQueries() para que esto funcione. Una corrutina con ámbito se ejecuta en su subproceso.

Esto es lo que hice no hace mucho:

 @UiThread fun getUsers(context: Context): LiveData<List<User>> { if (!::users.isInitialized) { users = MutableLiveData() users.postValue(MyDatabase.get(context).users().getAll()) GlobalScope.launch(Dispatchers.Main) { val usersFromDb: List<User> = async(Dispatchers.IO) { return@async MyDatabase.get(context).users().getAll() }.await() users.value = usersFromDb } } return users }

Puede ver que se llama a este método getUsers() desde el hilo principal, devolviendo un LiveData (que es útil en este caso). La consulta de la base de datos ocurre en GlobalScope.launch() .

Así que sí, tu diseño es uno que personalmente me gusta. Y uno que funcione. Pero no creo que necesites allowMainThreadQueries() en absoluto. Siéntase libre de leer (mi) publicación de blog: https://proandroiddev.com/android-viewmodel-livedata-coroutines-contraption-e1e44af690a6

over 4 years ago · Santiago Trujillo Report

0

Se recomienda acceder a la base de datos en su ViewModel dentro viewmodelScope . Si es así, necesita acceder a la base de datos de la sala desde la actividad o el uso de fragmentos

lifecyclescope.launch{ // access database dao functions here which are suspend in definition. }

O dentro de lifecycleScope, cambie su hilo usando withContext(Dispatchers.IO){}

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!