2012-02-24 12 views
133

He escrito un par de archivos de diseño donde utilicé el atributo layout_weight para crear una relación entre diferentes vistas.¿Por qué los pesos anidados son malos para el rendimiento? ¿Alternativas?

En algún momento, comienzo a recibir advertencias sobre pelusas sobre los pesos anidados.

Por lo tanto, me pregunto por qué los pesos anidados son malos para el rendimiento, y si hay una forma más eficiente de crear una relación constante entre dimensiones de vista que podrían usarse para diferentes tamaños de pantalla y que no necesita especificar mucho de los valores de ppp de dimensión a través de varios archivos de diseño (para diferentes tamaños de pantalla, quiero decir).

¡Gracias!

+2

Una publicación impresionante para la optimización del diseño http://developer.android.com/training/improving-layouts/optimizing-layout.html –

Respuesta

124

pesos anidados son perjudiciales para el rendimiento porque:

pesos Disposición requieren un widget a medir dos veces. Cuando se anida un LinearLayout con pesos distintos de cero dentro de otro LinearLayout con pesos distintos de cero, entonces el número de mediciones aumenta exponencialmente.

Siempre es mejor usar RelativeLayout sy ajustar su vista según los lugares de otras vistas sin usar valores de ppp específicos.

+80

Lo bueno es tener en cuenta, que supongo que es el propósito del mensaje. Yo * * notaría que un impacto exponencial es aún pequeño si el exponente involucrado es pequeño. Para pequeñas profundidades de anidamiento, usar * no * la CPU requerida para hacer esto es como tener un caballo de batalla que cuide durante toda la semana y solo salga a caminar los domingos. Aún así, para grandes profundidades de anidación, es un punto bien tomado. – Carl

+12

RelativeLayout también necesita medir dos veces para asegurarse de que todos sus hijos estén correctamente distribuidos, por lo que es posible que el cambio de LinearLayout con el peso de diseño a RelativeLayout no mejore el rendimiento. – Piasy

0

Creo que la única alternativa es hacer una función que se llamaría onResume y establecerá todos los tamaños y posiciones. De todos modos, en peso puede establecer solo tamaños pero sin relleno (por lo que los diseños se vuelven aún más complicados), sin textSize (imposible de compensar de alguna manera), y mucho menos cosas como el número de líneas.

9

La razón principal por la que los pesos anidados son malos es que cuando un diseño tiene niños con un peso, debe medirse dos veces (creo que esto se menciona en la advertencia de pelusas). Esto significa que un diseño ponderado que también contiene un diseño ponderado tiene que medirse cuatro veces, y cada 'capa' de pesos que agregue aumentará las medidas con una potencia de dos.

En ICS (API nivel 14) se agregó GridLayout, que permite soluciones simples y 'planas' para muchos diseños que anteriormente requerían pesos. Si está desarrollando versiones anteriores de Android, tendrá un poco más de tiempo para quitar pesas, pero al usar un RelativeLayout y aplanar tanto como sea posible su diseño en esa cabina, generalmente se eliminan muchos de los pesos anidados.

+9

No creo que pueda lograr los mismos resultados con 'GridLayout' * o *' RelativeLayout'. P.ej. para 'GridLayout':" GridLayout no proporciona soporte para el principio de peso, como se define en peso. En general, no es posible configurar un GridLayout para distribuir el exceso de espacio entre múltiples componentes. " – Timmmm

+0

Comenzando en API 21, la noción de peso se agregó a GridLayout. Para admitir dispositivos Android antiguos, puede usar GridLayout desde la biblioteca de soporte v7. android.support.v7.widget.GridLayout –

38

Creo (y probablemente me llame la atención por esto), pero una vez más creo que mi teléfono tiene un procesador de cuatro núcleos para competir (si no destruir completamente) la mayoría de las personas en casa.

También creo que este tipo de capacidad de hardware es el futuro de los teléfonos.

Así que llego a la conclusión de que, mientras no se deje llevar por la anidación (en MHO, el diseño nunca debe tener más de 4 niveles de profundidad, y si es probable que lo esté haciendo mal), su al teléfono no le importa tener pesas.

Hay muchas cosas que puede hacer que tendrán un efecto de mayor alcance en el rendimiento, y luego preocuparse de que su procesador haga algunas operaciones matemáticas adicionales.

(tenga en cuenta que estoy siendo un poco humorístico, por lo que no tomar nada demasiado en serio de esta publicación, aparte de la idea de que hay otras cosas que debe optimizar primero, y que preocuparse por un nivel 2-3 profunda peso no está ayudando a su salud)

+0

tomado, y esencialmente de acuerdo, pero he escuchado que el uso promedio de iphone (incluyendo los servicios web/sitio que lo soportan) tiene la misma cantidad de energía al año que el refrigerador doméstico promedio de EE. UU. . Por lo tanto, es nuestra responsabilidad como desarrolladores tener en cuenta este tipo de impacto ambiental. Obviamente, siempre es un acto de equilibrio: tiempo, costos, rendimiento, estabilidad y, en general, estoy de acuerdo con su punto de vista, pero creo que también deberíamos considerar este tipo de impacto. Obviamente, el mantenimiento/extensibilidad también viene aquí. De todos modos, punto hecho y gracias. – MemeDeveloper

+0

Darse cuenta del punto específico en cuestión es sobre el procesamiento en el dispositivo, no en la web, sino que significa mi comentario como un punto general sobre las prioridades de los desarrolladores más que los detalles del OP. – MemeDeveloper

44

actualización: Como sabemos la biblioteca por ciento de apoyo está en desuso desde el nivel del API 26. ConstraintLayout es la nueva manera de lograr la misma estructura XML plana.

Updated Github Project

muestras Actualizado:

<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/fifty_thirty" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:background="#ffff8800" 
     android:gravity="center" 
     android:text="@string/fifty_fifty_text" 
     android:textColor="@android:color/white" 
     app:layout_constraintHeight_default="percent" 
     app:layout_constraintHeight_percent="0.5" 
     android:textSize="25sp" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintWidth_default="percent" 
     app:layout_constraintWidth_percent="0.5" /> 

    <TextView 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:background="#ffff5566" 
     android:gravity="center" 
     android:text="@string/fifty_fifty_text" 
     android:textColor="@android:color/white" 
     android:textSize="25sp" 
     app:layout_constraintHeight_default="percent" 
     app:layout_constraintHeight_percent="0.5" 
     app:layout_constraintLeft_toRightOf="@id/fifty_thirty" 
     app:layout_constraintTop_toBottomOf="@id/fifty_thirty" 
     app:layout_constraintWidth_default="percent" 
     app:layout_constraintWidth_percent="0.5" /> 

</android.support.constraint.ConstraintLayout> 

Actualización: gran biblioteca por ciento de apoyo noticias androide resuelve nuestro problema de rendimiento y anidada desordenado ponderada LinearLayout

compile 'com.android.support:percent:23.0.0' 

Demo HERE

consideran este diseño simple para demostrar la misma.

percent support libray demo

<android.support.percent.PercentRelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <TextView 
     android:id="@+id/fifty_huntv" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:background="#ff7acfff" 
     android:text="20% - 50%" 
     android:textColor="@android:color/white" 
     app:layout_heightPercent="20%" 
     app:layout_widthPercent="50%" /> 
    <TextView 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_toRightOf="@id/fifty_huntv" 
     android:background="#ffff5566" 
     android:text="80%-50%" 
     app:layout_heightPercent="80%" 
     app:layout_widthPercent="50%" 
     /> 

</android.support.percent.PercentRelativeLayout> 

rendimiento evitada degradador anidados LinearLayout con weights.Really impresionante !!!.

+0

¿Entonces es mejor para el rendimiento? – dan

+0

@dan Sí, teniendo en cuenta que hemos anidado el diseño lineal con pesos. – nitesh

+3

"Esta clase ha quedado obsoleta en el nivel 26 de la API.0.0-beta1. considere utilizar en su lugar el uso de ConstraintLayout y los diseños asociados. "Https://developer.android.com/reference/android/support/percent/PercentRelativeLayout.html – saiyancoder

Cuestiones relacionadas