Android 布局Layout 性能优化<8>

这个是个老话题了,前面有一些提及过了,专家的建议如下:

提升布局性能的关键点是尽量保持布局层级的扁平化,避免出现重复的嵌套布局。例如下面的例子,有2行显示相同内容的视图,分别用两种不同的写法来实现,他们有着不同的层级

当然还的知道为什么需要这样调整:

Android需要把XML布局文件转换成GPU能够识别并绘制的对象。这个操作是在DisplayList的帮助下完成的。DisplayList持有所有将要交给GPU绘制到屏幕上的数据信息。

在某个View第一次需要被渲染时,Display List会因此被创建,当这个View要显示到屏幕上时,我们会执行GPU的绘制指令来进行渲染
请注意:任何时候View中的绘制内容发生变化时,都会需要重新创建DisplayList,渲染DisplayList,更新到屏幕上等一系列操作。这个流程的表现性能取决于你的View的复杂程度,View的状态变化以及渲染管道的执行性能。举个例子,假设某个Button的大小需要增大到目前的两倍,在增大Button大小之前,需要通过父View重新计算并摆放其他子View的位置。修改View的大小会触发整个HierarcyView的重新计算大小的操作。如果是修改View的位置则会触发HierarchView重新计算其他View的位置。如果布局很复杂,这就会很容易导致严重的性能问题。


现在android 设备的Hierarchy Viewer这个东东对一般的开发者好像已经不能够使用了,不过手机产商那些开发者是没有问题的.


废话不多说,新建Android 工程.


<1> : 新建Android 工程如下:

Android 布局Layout 性能优化<8>_第1张图片


<2> 具体程序如下:

DurianMainActivity.java

package org.durian.durianlayoutperfect;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;

import org.durian.durianlayoutperfect.adapter.DurianBaseAdapter;

public class DurianMainActivity extends ActionBarActivity {

    private ListView listView;

    private DurianBaseAdapter mDurianBaseAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.durian_main);

        listView=(ListView)findViewById(android.R.id.list);

        mDurianBaseAdapter=new DurianBaseAdapter(this);
        listView.setAdapter(mDurianBaseAdapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_durian_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}




DurianBaseAdapter.java

package org.durian.durianlayoutperfect.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import org.durian.durianlayoutperfect.R;

/**
 * Project name : DurianLayoutPerfect
 * Created by zhibao.liu on 2016/1/11.
 * Time : 18:26
 * Email [email protected]
 * Action : durian
 */
public class DurianBaseAdapter extends BaseAdapter {

    private Context mContext;
    private LayoutInflater mInflater;
    private ViewHolder holder;

    public DurianBaseAdapter(Context context){

        mContext=context;
        mInflater= LayoutInflater.from(mContext);
        holder=new ViewHolder();

    }

    @Override
    public int getCount() {
        return 10;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if(convertView==null) {

            convertView=mInflater.inflate(R.layout.durian_relate_list_item,null);
//            convertView=mInflater.inflate(R.layout.durian_list_item,null);

            holder.imageView=(ImageView) convertView.findViewById(R.id.image);
            holder.titleText=(TextView)convertView.findViewById(R.id.title);
            holder.summaryText=(TextView)convertView.findViewById(R.id.summary);

        }

        return convertView;

    }

    private class ViewHolder{

        ImageView imageView;
        TextView titleText;
        TextView summaryText;

    }

}

durian_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="org.durian.durianlayoutperfect.DurianMainActivity">

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

</RelativeLayout>

durian_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="96dp"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/image"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:src="@mipmap/ic_launcher" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="12dp"
        android:background="#fffffe"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Title"
                android:textColor="#ff0000"/>

            <TextView
                android:id="@+id/info"
                android:layout_alignParentRight="true"
                android:paddingRight="32dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Information"
                android:textColor="#00ff00"/>

        </RelativeLayout>


        <TextView
            android:id="@+id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Summary : This behaves the same as save(), but in addition it allocates an offscreen bitmap"
            android:textColor="#0000ff"/>

    </LinearLayout>

</LinearLayout>

durian_relate_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="96dp"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/image"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:src="@mipmap/ic_launcher" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="12dp"
        android:background="#fffffe"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Title"
                android:textColor="#ff0000"/>

            <TextView
                android:id="@+id/info"
                android:layout_alignParentRight="true"
                android:paddingRight="32dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Information"
                android:textColor="#00ff00"/>

        </RelativeLayout>


        <TextView
            android:id="@+id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Summary : This behaves the same as save(), but in addition it allocates an offscreen bitmap"
            android:textColor="#0000ff"/>

    </LinearLayout>

</LinearLayout>

<3> : 运行结果:
Android 布局Layout 性能优化<8>_第2张图片


无论在getView中替换哪一个布局,最终呈现的效果是一样的,但是性能会有差别的,这里加载的量不是很大,所以观察起来并不是很方便,而且还没有进行刷新,如果有刷新的时候,才会明显感觉到有差别.






你可能感兴趣的:(Android 布局Layout 性能优化<8>)