La aplicación puede estar haciendo demasiado trabajo en su hilo principal

Soy nuevo en el entorno Android SDK / API. Es el primero que bash dibujar un diagtwig / gráfico. Intenté ejecutar diferentes tipos de códigos de muestra utilizando el emulador de 3 bibliotecas libres diferentes, nada se muestra en la pantalla de diseño. El logcat repite el siguiente mensaje:

  W / Trace (1378): valor inesperado de nativeGetEnabledTags: 0
  I / Coreógrafo (1378): saltó 55 cuadros!  La aplicación puede estar haciendo demasiado trabajo en su hilo principal. 

El problema no persistió y la tabla funcionó cuando ejecuté un código de muestra perteneciente a una copia de evaluación de una biblioteca con licencia.

tomado de: IU de Android: reparación de marcos omitidos

Cualquier persona que comience a desarrollar una aplicación para Android verá este mensaje en el logcat “Coreógrafo (abc): ¡Se saltaron los fotogtwigs xx! La aplicación puede estar haciendo demasiado trabajo en su hilo principal. “ Entonces, ¿qué significa realmente, por qué debería preocuparse y cómo resolverlo?

Lo que esto significa es que su código está tardando mucho en procesarse y se están omitiendo los marcos debido a ello, tal vez debido a un procesamiento pesado que está haciendo en el corazón de su aplicación o acceso a BD o cualquier otra cosa que hace que el hilo parar por un tiempo Aquí hay una explicación más detallada:

Coreógrafo permite que las aplicaciones se conecten a la vsync, y cronometrar las cosas para mejorar el rendimiento.

Las animaciones de vista de Android utilizan internamente Choreographer con el mismo objective: sincronizar correctamente las animaciones y posiblemente mejorar el rendimiento.

Como a Coreógrafo se le informa sobre cada evento vsync, puedo decir si uno de los Runnables transferidos por Choreographer.post * apis no termina en el tiempo de un fotogtwig, lo que hace que se omitan los fotogtwigs.

En mi comprensión, Coreógrafo solo puede detectar el salto de cuadros. No tiene forma de decir por qué sucede esto.

El mensaje “La aplicación puede estar haciendo demasiado trabajo en su hilo principal” podría ser engañoso.

fuente: Significado de los mensajes del coreógrafo en Logcat

Por qué deberías preocuparte

Cuando aparece este mensaje en el emulador de Android y el número de fotogtwigs omitidos es bastante pequeño (<100), entonces puedes tomar la apuesta segura de que el emulador es lento, lo que sucede casi todas las veces. Pero si la cantidad de fotogramas omitidos y grandes es del orden de 300+, puede haber problemas serios con su código. Los dispositivos Android vienen en una amplia gama de hardware a diferencia de ios y dispositivos de Windows. La memoria RAM y la CPU varían y si desea un rendimiento razonable y la experiencia del usuario en todos los dispositivos, entonces debe solucionarlo. Cuando se omiten los marcos, la IU es lenta y lenta, lo que no es una experiencia de usuario deseable.

Como arreglarlo

Para solucionarlo, es necesario identificar los nodos en los que existe, o posiblemente puede suceder, una larga duración del procesamiento. La mejor manera es hacer todo el procesamiento, sin importar cuán pequeño o grande sea el hilo separado del hilo principal de la IU. Así que sea accediendo a los datos de la base de datos SQLite o haciendo algunas matemáticas difíciles o simplemente clasificando una matriz. Hazlo en un hilo diferente

Ahora hay un truco aquí, creará un nuevo subproceso para hacer estas operaciones y cuando ejecute la aplicación, se bloqueará diciendo “solo el subproceso original que creó una jerarquía de vista puede tocar sus vistas”. Necesitas saber este hecho de que la interfaz de usuario en Android se puede cambiar solo por el hilo principal o el hilo de UI. Cualquier otro hilo que intente hacerlo, falla y falla con este error. Lo que necesita hacer es crear un Runnable nuevo dentro de runOnUiThread y dentro de este ejecutable debe hacer todas las operaciones que involucran la UI. Encuentre un ejemplo aquí .

Entonces, tenemos Thread and Runnable para procesar datos fuera del hilo principal, ¿qué más? Hay AsyncTask en Android que permite realizar procesos a largo plazo en el hilo de la interfaz de usuario. Este es el más útil cuando sus aplicaciones son impulsadas por datos o api de la web o usan UI complejas como aquellas comstackdas usando Canvas. El poder de AsyncTask es que permite hacer cosas en segundo plano y, una vez que hayas terminado de procesar, puedes simplemente realizar las acciones necesarias en la interfaz de usuario sin causar ningún efecto rezagado. Esto es posible porque AsyncTask se deriva del hilo de la interfaz de usuario de Activity: todas las operaciones que realiza en la interfaz de usuario a través de AsyncTask se realizan con un hilo diferente del hilo principal de la IU, sin obstáculos para la interacción del usuario.

Así que esto es lo que necesita saber para hacer aplicaciones de Android suaves y, hasta donde sé, cada principiante recibe este mensaje en su consola.

Como otros respondieron anteriormente, “¡saltó 55 cuadros!” significa que hay un gran procesamiento en su aplicación.

Para mi caso, no hay un proceso pesado en mi aplicación. Dupliqué y tripité revisé todo y eliminé esos procesos, creo que fue un poco pesado.

Eliminé Fragmentos, Actividades, Bibliotecas hasta que solo quedó el esqueleto. Pero aún así el problema no desapareció. Decidí verificar los recursos y descubrí que algunos íconos y antecedentes que uso son bastante grandes ya que olvidé verificar el tamaño de esos recursos.

Por lo tanto, mi sugerencia es que si ninguna de las respuestas anteriores ayuda, también puede verificar el tamaño de los archivos de recursos.

Yo también tuve el mismo problema.
El mío era un caso en el que estaba usando una imagen de fondo que estaba en dibujables. Esa imagen en particular era de aproximadamente 130kB y se usó durante la pantalla de bienvenida y la página de inicio en mi aplicación de Android.

Solución – Acabo de cambiar esa imagen en particular a la carpeta drawables-xxx de los objetos dibujables y pude liberar mucha memoria ocupada en el fondo y los marcos saltados ya no saltaban.

Actualizar Utilice la carpeta de recursos dibujables ‘nodp’ para almacenar archivos de fondo dibujables.
¿Tendrán prioridad una carpeta dibujable de densidad o drawable-nodpi?

Otra causa común de retrasos en el hilo de UI es el acceso de SharedPreferences. Cuando llamas a PreferenceManager.getSharedPreferences y a otros métodos similares por primera vez, el archivo .xml asociado se carga inmediatamente y se analiza en el mismo hilo .

Una de las mejores formas de combatir este problema es la activación de la primera carga de SharedPreference desde el hilo de fondo, iniciada lo más pronto posible (por ejemplo, desde onCreate de su clase de aplicación). De esta forma, el objeto de preferencia ya puede estar construido para el momento en que desee usarlo.

Desafortunadamente, a veces es necesario leer los archivos de preferencias durante las primeras fases de inicio (por ejemplo, en la Actividad inicial o incluso en la propia Aplicación). En tales casos, aún es posible evitar el locking de la IU mediante el uso de MessageQueue.IdleHandler . Haga todo lo demás que necesite para realizar en el hilo principal, luego instale IdleHandler para ejecutar el código una vez que su Actividad haya sido dibujada por completo. En ese Runnable, debe poder acceder a SharedPreferences sin demorar demasiadas operaciones de dibujo y hacer que Choreographer no sea feliz.

Intente utilizar las siguientes estrategias para mejorar el rendimiento de su aplicación:

  • Use la progtwigción multi-threading si es posible. Los beneficios de rendimiento son enormes, incluso si su teléfono inteligente tiene un núcleo (los hilos pueden ejecutarse en diferentes núcleos, si el procesador tiene dos o más). Es útil separar la lógica de su aplicación de la interfaz de usuario. Use hilos de Java, AsyncTask o IntentService. Mira esto
  • Lea y siga los consejos de rendimiento misceláneos del sitio web de desarrollo de Android. Mira aquí .

No soy un experto, pero obtuve este mensaje de depuración cuando quería enviar datos desde mi aplicación de Android a un servidor web. Aunque utilicé la clase AsyncTask e hice la transferencia de datos en segundo plano, para recuperar los datos de los resultados del servidor utilicé el método get () de la clase AsyncTask que hace que la UI sea sincrónica, lo que significa que su UI estará esperando demasiado tiempo. Así que mi consejo es hacer que su aplicación haga cada tarea orientada a la red en un hilo separado.

Yo tuve el mismo problema. En mi caso, tuve 2 diseños relativos nesteds. RelativeLayout siempre tiene que hacer dos pasos de medida. Si anida RelativeLayouts, obtendrá un algoritmo de medición exponencial.

Optimiza tus imágenes … No uses imágenes de más de 100 KB … La carga de imágenes requiere demasiada CPU y hace que tu aplicación se cuelgue.

Yo tuve el mismo problema. Android Emulator funcionó perfectamente en Android <= 6.0. Cuando probé con el emulador Nexus 5 (Android 6.0), la aplicación funcionaba muy lento con I/Choreographer: Skipped frames en los registros.

Así que resolví este problema cambiando en hardwareAccelerated opción Manifest file hardwareAccelerated a true así:

    ...   

Mi aplicación tuvo el mismo problema. Pero no estaba haciendo otra cosa que mostrar una lista de tarjetas y texto en ella. Nada corriendo en segundo plano. Pero luego de una investigación descubrió que la imagen configurada para el fondo de la tarjeta estaba causando esto, aunque era pequeña (350kb). Luego convertí la imagen en 9 imágenes de parche usando http://romannurik.github.io/AndroidAssetStudio/index.html .
Esto funcionó para mí.

Después de hacer mucho I + D en este tema, obtuve la Solución,

En mi caso, estoy usando un servicio que se ejecutará cada 2 segundos y con el runUIThread, me preguntaba si el problema estaba allí, pero no en absoluto. El siguiente problema que encontré es que estoy usando una gran imagen en la aplicación de mayo y ese es el problema.

Eliminé las imágenes y establecí nuevas imágenes.

Conclusión: Mire en su código si hay algún archivo sin formato que esté utilizando y sea de gran tamaño.

Primero lee la advertencia. Dice más carga en el hilo principal. Entonces, lo que tienes que hacer es ejecutar funciones con más trabajo en un hilo.

Yo tuve el mismo problema. Cuando ejecuté el código en otra computadora, funcionó bien. En el mío, sin embargo, se muestra “La aplicación puede estar haciendo demasiado trabajo en su hilo principal”.

Resolví mi problema reiniciando el estudio de Android [Archivo -> Cachés invalidados / Reiniciar -> clic en “Invalidar y reiniciar”].

Obtuve el mismo problema al desarrollar una aplicación que utiliza muchos archivos png dibujables en el diseño de la cuadrícula. También traté de optimizar mi código en la medida de lo posible … pero no funcionó para mí … Entonces traté de reducir el tamaño de esos png … y supongo que funciona absolutamente bien … Así que mi sugerencia es reducir tamaño de los recursos dibujables si alguno ..

Puede usar la biblioteca Glide para cargar imágenes … cargará la imagen en el hilo de fondo.