50 votos

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

Una respuesta al final de esta pregunta ha sido llenada, la combinación de observaciones y soluciones.

Pregunta

He buscado pero no he encontrado nada que realmente explica por qué Android Lint , así como algunos Eclipse indicios sugieren la sustitución de algunos layout_height y layout_width valores 0dp.

Por ejemplo, yo tengo un ListView que se sugirió a ser cambiado

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 de

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1">
</ListView>

Del mismo modo, se sugiere un cambio a un elemento ListView. Todos ellos tienen el mismo aspecto antes y después de los cambios, pero estoy interesado en la comprensión de por qué estos son potenciadores del rendimiento.

Alguien tiene una explicación de por qué? Si ayuda, aquí es el diseño general con la ListView.

<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>

Respuesta

Me voy a poner en una respuesta aquí porque es realmente una combinación de respuestas y se hace referencia a los enlaces de abajo. Si estoy equivocado en algo, hágamelo saber.

De ¿Cuál es el truco con 0dip layout_height o layouth_width?

Hay 3 de la disposición general de los atributos que trabajar con la anchura y altura

  1. android:layout_height
  2. android:layout_width
  3. android:layout_weight

Cuando una LinearLayout es vertical, entonces el layout_weight tendrá efecto en la altura del niño, Views (ListView). Ajuste de la layout_height a 0dp hará que este atributo para ser 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 una LinearLayout es horizontal, entonces el layout_weight será el efecto de la anchura del niño Views (ListView). Ajuste de la layout_width a 0dp hará que este atributo para ser 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 usted no ignora, que sería utilizado para calcular el diseño que utiliza más tiempo de CPU.

Además así se evita cualquier confusión sobre lo que el diseño debe verse como cuando se usa una combinación de los tres atributos. Este se destaca por @desarrollador de android en una respuesta a continuación.

Además, Android Pelusa y Eclipse ambos dicen que el uso de 0dip. A partir de la respuesta a continuación, usted puede usar 0dip, 0dp, 0px, etc desde un tamaño cero es el mismo en cualquiera de las unidades.

Evitar wrap_content en ListView

De Layout_width de un ListView

Si alguna vez te has preguntado por qué getView(...) es llamado tantas veces como yo, resulta ser relativa a la wrap_content.

El uso de wrap_content como yo estaba usando anteriormente hará que todos los niños Views a medir que va a causar más tiempo de CPU. Esta medida hará que su getView(...) a ser llamado. Ahora he probado este y el número de veces getView(...) se llama se reduce dramáticamente.

Cuando yo estaba usando wrap_content dos ListViews, getView(...) fue llamado 3 veces para cada fila en una ListView y 4 veces para cada fila de la otra.

El cambio de este a la recomendada 0dp, getView(...) se llama sólo una vez para cada fila. Esto es una gran mejora, pero tiene más que ver con evitar la wrap_content en ListView que 0dp.

Sin embargo, la sugerencia de 0dp hace mejorar sustancialmente el rendimiento a causa de esto.

14voto

Prabuddha Puntos 37089

Lo primero de todo es esto,

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1">
</ListView>

Nunca tome el control de la altura de wrap_content, que llevará a los problemas. Here es la razón de que e this answer.

Aún más,

He buscado pero no he encontrado nada que realmente explica por qué Android Lint, así como algunos Eclipse sugerencias sugiere la sustitución de algunos layout_height y layout_width valores con 0dp.

Es porque usted está usando layout_weight = "1" que significa que su ListView con que tomar la altura como mucho como está disponible. Así que, en ese caso, no hay necesidad de usar layout_height = "wrap_content" se cambie a la android:layout_height="0dp" y ListView altura será administrado por layout_weight = "1".

9voto

Archie.bpgc Puntos 8027

Así que cuando android:layout_weight se utiliza en la Vista de X y LinearLayout es horizontal, entonces X android:layout_width es simplemente ignorado.

Similar, cuando android:layout_weight se utiliza en la Vista de X y LinearLayout es vertical, entonces X android:layout_height es ignorado.

En realidad, esto significa, que usted puede poner cualquier cosa en los ignorado campos: 0dp o fill_parent o wrap_content. No importa. Pero se recomienda el uso 0dp por lo que la Vista no hacer cálculo adicional de su altura o anchura (el cual es ignorado). Este pequeño truco, simplemente guarda los ciclos de CPU.

de :

¿Cuál es el truco con 0dip layout_height o layouth_width?

4voto

android developer Puntos 20939

que yo sepa , hay una diferencia entre el uso de 0dp (o 0px por cierto, es el mismo desde 0 es 0, no importa lo que es la unidad de aquí ) y el wrap_content o fill_parent (o match_parent, es el mismo).

depende del peso que usted utiliza . si sólo vas a usar el peso de 1 , todos ellos tienen el mismo aspecto , pero el significado es siempre diferente , y es importante para el rendimiento.

para mostrar esto , pruebe lo siguiente:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
  android:layout_height="match_parent" android:orientation="vertical">

  <TextView android:id="@+id/textView1" android:layout_width="match_parent"
    android:layout_height="0px" android:text="1" android:background="#ffff0000"
    android:layout_weight="1" android:gravity="center"
    android:textColor="#ffffffff" android:textSize="20sp" />

  <TextView android:id="@+id/textView2" android:layout_width="match_parent"
    android:layout_height="0px" android:text="2" android:background="#ff00ff00"
    android:layout_weight="2" android:gravity="center"
    android:textColor="#ffffffff" android:textSize="20sp" />

  <TextView android:id="@+id/textView3" android:layout_width="match_parent"
    android:layout_height="0px" android:text="3" android:background="#ff0000ff"
    android:layout_weight="3" android:gravity="center"
    android:textColor="#ffffffff" android:textSize="20sp" />

</LinearLayout>

y, a continuación, intente reemplazar la 0px con match_parent . verás que el resultado es muy diferente.

generalmente , para una mejor comprensión y para un mejor rendimiento , puede que desee utilizar 0px.

1voto

Karu Puntos 1065

LinearLayout medidas de todos los niños de acuerdo a la layout_width/layout_height valores y luego se divide el sobrante de espacio (que puede ser negativo) de acuerdo a la layout_weight valores.

0dp es más eficiente que la wrap_content , en este caso, debido a que es más eficiente utilizar el cero de la altura original y, a continuación, dividir la matriz completa de la altura en función del peso que a medida que el niño primero y, a continuación, dividir el resto se basan en el peso.

Por lo que la eficiencia viene de no medir el niño. 0dp debe ser exactamente igual de eficiente (y producen exactamente el mismo resultado) como match_parento 42px, o cualquier otro número fijo.

0voto

Damien Puntos 11

Precaución volver a usar android:layout_height="0dp"

He encontrado que en un ListView (se recomienda Ver el reciclaje mediante convertView, ver p.ej. http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/), configuración de android:layout_height="0dp" para la fila TextView puede llevar a texto de truncamiento para multi-línea de contenido de texto.

Cada vez que un TextView objeto que se utilizó anteriormente para mostrar un texto que se incluye en una sola línea de reciclado para mostrar un texto más largo que necesita más de una línea, el texto se trunca a una sola línea.

El problema es curado por el uso de android:layout_height="wrap_content"

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X