Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Significado de los mensajes coreógrafo en Logcat

He instalado las últimas versiones de SDK (API 16) y obtuvo el último ADT. Ahora estoy viendo estos mensajes en el logcat, que estoy seguro, no he visto antes. ¿Alguien tiene una idea sobre esto?

06-29 23: 11: 17.796: Yo / Coreógrafo (691): ¡Saltamos 647 cuadros! La aplicación puede estar haciendo demasiado trabajo en su subproceso principal.

  • LinearLayout animate () pincha la vista, clipChildren no funciona
  • Iniciar una actividad con la intención y desactivar la pulsación de botón de inicio de la actividad anterior
  • ¿El desarrollo de la interfaz de usuario de Android se presta bien a un patrón de diseño participativo?
  • Cambiar el color del texto del título para ActionBar en el tema AppCompatActivity
  • Cómo configurar el color de fondo de una vista
  • Consultar la base de datos de Google Play Música en Android
  • Hice una búsqueda y encontré este enlace: http://developer.android.com/reference/android/view/Choreographer.html . Se trata de una nueva clase introducida en API 16.

    Necesito saber cómo puedo determinar qué "demasiado trabajo" mi aplicación puede estar haciendo ya que todo mi procesamiento se realiza en AsyncTask s.

  • InterruptedException al depurar la aplicación de Android
  • ¿Cómo mostrar el ActionBar normal y dividido?
  • Android cómo obtener indican cuando se pierde la conexión a Internet?
  • Android fuera de la prevención de la memoria
  • ¿Cómo agregar margen entre EditText y Soft Keyboard?
  • Versión sin soporte de major.minor 52.0 en mi aplicación
  • 5 Solutions collect form web for “Significado de los mensajes coreógrafo en Logcat”

    Choreographer permite que las aplicaciones se conecten a la vsync, y correctamente las cosas de tiempo para mejorar el rendimiento.

    Las animaciones de vista de Android usan internamente Choreographer para el mismo propósito: acortar adecuadamente las animaciones y, posiblemente, mejorar el rendimiento.

    Desde Choreographer se le dice acerca de todos los eventos vsync, puedo decir si uno de los Runnables pasado por el Choreographer.post * apis doesnt terminar en el tiempo de un marco, haciendo que los marcos se saltan.

    En mi entendimiento el coreógrafo solo puede detectar el salto de marco. No tiene forma de saber por qué sucede esto.

    El mensaje "La aplicación puede estar haciendo demasiado trabajo en su subproceso principal." Podría ser engañosa.

    Llego tarde a la fiesta, pero espero que esto sea una adición útil a las otras respuestas aquí …

    Respuesta a la pregunta / tl: dr;

    Necesito saber cómo puedo determinar qué "demasiado trabajo" mi aplicación puede estar haciendo ya que todo mi procesamiento se realiza en AsyncTasks.

    Los siguientes son todos candidatos:

    • IO o procesamiento costoso en el hilo principal (cargar dibujables, inflar diseños y configurar Uri 's en ImageView constituyen todos IO en el hilo principal)
    • Representación de jerarquías de View grandes / complejas / profundas
    • Invalidación de grandes porciones de una jerarquía de View
    • Métodos onDraw caros en las View personalizadas
    • Cálculos costosos en animaciones
    • Ejecución de subprocesos de "trabajo" en una prioridad demasiado alta para que se considere "fondo" ( AsyncTask son "fondo" de forma predeterminada, java.lang.Thread no lo es)
    • Generar un montón de basura, haciendo que el recolector de basura para "detener el mundo" – incluyendo el hilo principal – mientras se limpia

    Para determinar la causa específica que necesitará para perfilar su aplicación.

    Mas detalle

    He estado tratando de entender Coreógrafos experimentando y mirando el código .

    La documentación de Choreographer se abre con "Coordina la sincronización de animaciones, entrada y dibujo." Que en realidad es una buena descripción, pero el resto pasa a exagerar las animaciones.

    El coreógrafo es realmente responsable de ejecutar 3 tipos de devoluciones de llamada, que se ejecutan en este orden:

    1. Callbacks de manejo de entrada (manejo de entrada de usuario, como eventos de toque)
    2. Callbacks de animación para interpolación entre fotogramas, proporcionando un frame-start-time estable a cualquier / todas las animaciones que se están ejecutando. Ejecutar estas callbacks significa que cualquier cálculo relacionado con la animación (por ejemplo, cambiar las posiciones de View) ya se han hecho en el momento en que se invoca el tercer tipo de callback …
    3. Ver las devoluciones de llamada cruzadas para dibujar la jerarquía de vista.

    El objetivo es coincidir con la velocidad a la que las vistas invalidadas se vuelven a dibujar (y las animaciones interpoladas) con la pantalla vsync – normalmente 60fps.

    La advertencia sobre los marcos omitidos parece una segunda idea: el mensaje se registra si un solo paso a través de los 3 pasos toma más de 30 veces la duración esperada del marco, por lo que el número más pequeño que puede esperar ver en los mensajes de registro es " ; Si cada pase toma un 50% más de lo que debería, todavía se saltará 30 cuadros ( travieso! ), Pero no se le advertirá.

    De los 3 pasos implicados su claro que no es sólo las animaciones que pueden activar la advertencia: Invalidar una parte significativa de una gran jerarquía View o una View con un complicado método onDraw podría ser suficiente.

    Por ejemplo, esto activará la advertencia repetidamente:

     public class AnnoyTheChoreographerActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_linear_layout); ViewGroup root = (ViewGroup) findViewById(R.id.root); root.addView(new TextView(this){ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); long sleep = (long)(Math.random() * 1000L); setText("" + sleep); try { Thread.sleep(sleep); } catch (Exception exc) {} } }); } } 

    … que produce el registro como esto:

     11-06 09:35:15.865 13721-13721/example I/Choreographer﹕ Skipped 42 frames! The application may be doing too much work on its main thread. 11-06 09:35:17.395 13721-13721/example I/Choreographer﹕ Skipped 59 frames! The application may be doing too much work on its main thread. 11-06 09:35:18.030 13721-13721/example I/Choreographer﹕ Skipped 37 frames! The application may be doing too much work on its main thread. 

    Usted puede ver desde la pila durante onDraw que el coreógrafo está involucrado independientemente de si está animando:

    En el ejemplo.AnnoyTheChoreographerActivity $ 1.onDraw (AnnoyTheChoreographerActivity.java:25) en android.view.View.draw (View.java:13759)

    … un poco de repetición …

    En android.view.ViewGroup.drawChild (ViewGroup.java:3169) en android.view.ViewGroup.dispatchDraw (ViewGroup.java:3039) en android.view.View.draw (View.java:13762) en android.widget. FrameLayout.draw (FrameLayout.java:467) en com.android.internal.policy.impl.PhoneWindow $ DecorView.draw (PhoneWindow.java:2396) en android.view.View.getDisplayList (View.java:12710) en android .view.View.getDisplayList (View.java:12754) en android.view.HardwareRenderer $ GlRenderer.draw (HardwareRenderer.java:1144) en android.view.ViewRootImpl.draw (ViewRootImpl.java:2273) en android.view. ViewRootImpl.performDraw (ViewRootImpl.java:2145) en android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1956) en android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1112) en android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:4472) en android.view.Choreographer $ CallbackRecord.run (Choreographer.java:725) en android.view.Choreographer.doCallbacks (Choreographer.java:555) en android.view.Choreographer.doFrame (Cho Reographer.java:525) en android.view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:711) en android.os.Handler.handleCallback (Handler.java:615) en android.os.Handler.dispatchMessage (Handler.java : 92) en android.os.Looper.loop (Looper.java:137) en android.app.ActivityThread.main (ActivityThread.java:4898)

    Por último, si hay contención de otros subprocesos que reducen la cantidad de trabajo que se puede hacer el subproceso principal, la posibilidad de saltar cuadros aumenta drásticamente aunque no está realmente haciendo el trabajo en el subproceso principal.

    En esta situación se podría considerar engañoso sugerir que la aplicación está haciendo demasiado en el hilo principal, pero Android realmente quiere que los hilos de trabajo se ejecuten en baja prioridad para que se les impida hambrientar el hilo principal. Si los hilos de trabajo son de baja prioridad, la única manera de activar la advertencia de Choreographer es realmente hacer demasiado en el hilo principal.

    Esto si es un mensaje de Info que podría hacer estallar su LogCat en muchas situaciones.

    En mi caso, sucedió cuando estaba inflando varias vistas de archivos de diseño XML mediante programación. El mensaje es inofensivo por sí mismo, pero podría ser el signo de un problema posterior que usaría toda la RAM que su aplicación está autorizada a usar y provocar que la Fuerza Mega-maligna ocurra. He crecido para ser el tipo de desarrollador que le gusta ver su registro WARN / INFO / ERROR Free. 😉

    Por lo tanto, esta es mi propia experiencia:

    Recibí el mensaje:

     10-09 01:25:08.373: I/Choreographer(11134): Skipped XXX frames! The application may be doing too much work on its main thread. 

    … cuando estaba creando mi propia "lista de múltiples secciones super-complejas" inflando una vista desde XML y rellenando sus campos (imágenes, texto, etc …) con los datos procedentes de la respuesta de un REST / Servicio web JSON (sin capacidades de paginación), estas vistas actuarían como filas, encabezados de sección secundaria y encabezados de sección al agregar todos ellos en el orden correcto a LinearLayout (con orientación vertical dentro de ScrollView). Todo eso para simular un listView con elementos que se pueden hacer clic … pero bueno, eso es para otra pregunta.

    Como desarrollador responsable, desea que la aplicación sea realmente eficiente con los recursos del sistema, por lo que la mejor práctica para las listas (cuando sus listas no son tan complejas) es utilizar ListActivity o ListFragment con un Loader y llenar el ListView con un adaptador, Esto es supuestamente más eficiente, de hecho es y debe hacerlo todo el tiempo, de nuevo … si su lista no es tan compleja.

    Solución: implementé la paginación en mi servicio web REST / JSON para evitar "grandes tamaños de respuesta" y envolvió el código que agregaba las vistas "filas", "cabeceras de sección" y "subcapítulos" en una AsyncTask para mantener el Main Hilo fresco.

    Así que … espero que mi experiencia ayude a alguien que está abriendo la cabeza con este mensaje de información.

    Feliz hacking!

    Esto suele suceder cuando se depura utilizando el emulador, que se sabe que es lento de todos modos.

    En mi caso tengo estos mensajes cuando muestro la barra de acción sherlock inderterminate barra de progreso. Puesto que no es mi biblioteca, decidí esconder las salidas del coreógrafo.

    Puede ocultar las salidas de Choreographer en la vista Logcat, utilizando esta expresión de filtro:

    Etiqueta: ^ ((?! Coreógrafo). *) $

    He utilizado un regex explicado en otros lugares: expresión regular para coincidir con una línea que no contiene una palabra?

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.