¿Por qué se considera 0dp una mejora de rendimiento?

Unresponder Al final de esta pregunta se ha completado, combinando comentarios y soluciones.

Pregunta

Busqué 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>
Responder

Pongo 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_heightandroid:layout_widthandroid:layout_weight

Cuando unLinearLayout esvertical, entonces ellayout_weight afectará elaltura de los niñosViewsListView). 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ñosViewsListView). 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ñoViews 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 dosListViewsgetView(...) 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.

Respuestas a la pregunta(5)

Su respuesta a la pregunta