Por que o 0dp é considerado um aprimoramento de desempenho?

Aresponda no final desta pergunta foi preenchida, combinando observações e soluções.

Questão

Eu procurei por aí, mas não encontrei nada que realmente explica por queAndroid Lint bem como algunsEclipse sugestões sugerem a substituição de algunslayout_height elayout_width valores com0dp.

Por exemplo, eu tenho umListView que foi sugerido para ser alterado

Antes

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

Depois de

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

Da mesma forma, sugeriu mudanças em umItem ListView. Todos parecem iguais antes e depois das alterações, mas estou interessado em entender por que esses são impulsionadores de desempenho.

Alguém tem uma explicação do porquê? Se isso ajuda, aqui está o layout geral com oListView.

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

Estou colocando uma resposta aqui porque é realmente uma combinação de respostas e links referenciados abaixo. Se eu estiver errado em alguma coisa, me avise.

DeQual é o truque com 0dip layout_height ou layouth_width?

Existem 3 atributos gerais de layout que funcionam comlargura ealtura

android:layout_heightandroid:layout_widthandroid:layout_weight

Quando umLinearLayout évertical, então olayout_weight afetará oaltura da criançaViews (ListView). Configurando olayout_height para0dp fará com que esse atributo seja ignorado.

Exemplo

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

Quando umLinearLayout éhorizontal, então olayout_weight afetará olargura da criançaViews (ListView). Configurando olayout_width para0dp fará com que esse atributo seja ignorado.

Exemplo

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

A razão para querer ignorar o atributo é que, se você não o ignorou, ele seria usado para calcular o layout que usa mais tempo de CPU.

Além disso, isso evita qualquer confusão sobre a aparência do layout ao usar uma combinação dos três atributos. Isso é destacado por@android developer em uma resposta abaixo.

Além disso,Android Lint eEclipse ambos dizem para usar0dip. A partir dessa resposta abaixo, você pode usar0dip, 0dp, 0px, etc, já que um tamanho zero é o mesmo em qualquer uma das unidades.

Evite wrap_content no ListView

DeLayout_width de um ListView

Se você já se perguntou por quegetView(...) é chamado tantas vezes como eu tenho, acaba por estar relacionado comwrap_content.

Usandowrap_content como eu estava usando acima fará com que toda criançaViews a ser medido, o que causará mais tempo de CPU. Esta medida fará com que o seugetView(...) ser chamado. Eu já testei isso e o número de vezesgetView(...) é chamado é reduzido drasticamente.

Quando eu estava usandowrap_content em doisListViewsgetView(...) foi chamado 3 vezes para cada linha em umListView e 4 vezes para cada linha do outro.

Mudando isso para o recomendado0dp, getView(...) foi chamado apenas uma vez para cada linha. Isso é uma grande melhoria, mas tem mais a ver com evitarwrap_content com umListView do que o faz0dp.

No entanto, a sugestão de0dp melhora substancialmente o desempenho por causa disso.

questionAnswers(5)

yourAnswerToTheQuestion