¿Por qué se considera 0dp una mejora de rendimiento?
Unresponder Al final de esta pregunta se ha completado, combinando comentarios y soluciones.
PreguntaBusqué alrededor pero no he encontrado nada que realmente explique por quéPelusa de Android así como algunosEclipse sugerencias sugieren reemplazar algunoslayout_height
ylayout_width
valores con0dp
.
Por ejemplo, tengo unListView
que se sugirió que se cambie
antes de
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
</ListView>
Después
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
Del mismo modo, sugirió cambios a unListView item. Todos estos son iguales antes y después de los cambios, pero me interesa entender por qué estos son impulsores del rendimiento.
¿Alguien tiene una explicación de por qué? Si ayuda, aquí está el diseño general con elListView
.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/logo_splash"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ImageView>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@color/background"
android:layout_below="@id/logo_splash">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
<TextView
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_upcoming" />
</LinearLayout>
</RelativeLayout>
ResponderPongo una respuesta aquí porque es realmente una combinación de respuestas y enlaces a los que se hace referencia a continuación. Si me equivoco en algo, házmelo saber.
Desde¿Cuál es el truco con 0dip layout_height o layouth_width?
Hay 3 atributos de diseño general que funcionan conanchura yaltura
android:layout_height
android:layout_width
android:layout_weight
Cuando unLinearLayout
esvertical, entonces ellayout_weight
afectará elaltura de los niñosView
sListView
). Configurando ellayout_height
a0dp
hará que este atributo sea ignorado.
Ejemplo
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
</LinearLayout>
Cuando unLinearLayout
eshorizontal, entonces ellayout_weight
afectará elanchura de los niñosView
sListView
). Configurando ellayout_width
a0dp
hará que este atributo sea ignorado.
Ejemplo
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<ListView
android:id="@android:id/list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
</ListView>
</LinearLayout>
La razón para querer ignorar el atributo es que si no lo ignoró, se usaría para calcular el diseño que usa más tiempo de CPU.
Además, esto evita cualquier confusión sobre cómo debe verse el diseño cuando se usa una combinación de los tres atributos. Esto está resaltado por@desarrollador de Android En una respuesta a continuación.
También,Pelusa de Android yEclipse ambos dicen usar0dip
. De esa respuesta a continuación, puedes usar0dip
, 0dp
, 0px
, etc. ya que un tamaño cero es el mismo en cualquiera de las unidades.
Evite wrap_content en ListView
DesdeLayout_width de un ListView
Si alguna vez te has preguntado por quégetView(...)
Se llama tantas veces como lo he hecho, resulta estar relacionado conwrap_content
.
Utilizandowrap_content
como estaba usando arriba causará todo niñoView
s para ser medido lo que causará más tiempo de CPU. Esta medida causará sugetView(...)
ser llamado. Ahora he probado esto y el número de vecesgetView(...)
Se llama se reduce dramáticamente.
Cuando estaba usandowrap_content
en dosListView
sgetView(...)
fue llamado 3 veces por cada fila en unaListView
y 4 veces por cada fila en la otra.
Cambiando esto a lo recomendado.0dp
, getView(...)
fue llamado una sola vez por cada fila. Esta es una gran mejora, pero tiene más que ver con evitarwrap_content
en unListView
de lo que hace el0dp
.
Sin embargo, la sugerencia de0dp
mejora sustancialmente el rendimiento debido a esto.