Android的性能优化

布局优化

1要懂得删除无用的控件跟层级,有选择性的使用消耗性能较的ViewGroup,如LinearLayout,FrameLayout,RelativityLayout(功能较复杂,它的布局过程需要消耗更多的CPU时间)。

2.多采用include标签,merge标签,ViewStub。

    Include标签:用于布局重用。

         Merge标签:可减少布局的层级。

         ViewStub:按需加载,当需要viewstub时才将布局加载到内存。

   

         Include标签只支持android:layout_开头的属性,其它属性不支持,当其指定了android:layout_*这些属性后,必须为其指定android:layout_width,android:layout_height,否则android:layout_*这类属性无效。

         Merge 标签一般跟include标签一起使用如:

         layout.xml

<?xml version="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="match_parent"

   android:layout_height="wrap_content"

   android:orientation="vertical" >

   <Button

       android:layout_width="match_parent"

       android:layout_height="48dp"

       android:text="Item"

       />

    <Button

       android:layout_width="match_parent"

       android:layout_height="48dp"

       android:text="Item"

       />

     <Button

       android:layout_width="match_parent"

       android:layout_height="48dp"

       android:text="Item"

       />

</LinearLayout>

在对应布局中使用:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:tools="http://schemas.android.com/tools"

   android:id="@+id/LinearLayout1"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   android:orientation="vertical"

   tools:context="${relativePackage}.${activityClass}" >

   <include

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       layout="@layout/layout"/>

</LinearLayout>

其中 include标签中的布局根层级是一个垂直的LinearLayout,而包裹include标签的上一层布局也是垂直的LinearLayout,所以可以用merge标签减速布局层数。更改如下:

<merge xmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="match_parent"

   android:layout_height="wrap_content"

    >

   <Button

       android:layout_width="match_parent"

       android:layout_height="48dp"

       android:text="Item"

       />

    <Button

       android:layout_width="match_parent"

       android:layout_height="48dp"

       android:text="Item"

       />

     <Button

       android:layout_width="match_parent"

       android:layout_height="48dp"

        android:text="Item"

       />

</merge>

         ViewStub 是非常轻量级的宽高都为0的view,本身不参与任何布局及绘制过程。

        

   <ViewStub

       android:id="@+id/viewstub"

       android:layout="@layout/layout"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       />

         显示Viewstub

         viewStub.setVisibility(View.VISIBLE);

绘制优化

在自定义view时,应避免在onDraw方法中执行大量操作,因为onDraw方法可能会被大量调用。

内存泄漏优化

1:静态变量导致内存泄漏

如:

public class YouhuaActivity extendsActivity {

         staticContext context;

         @Override

         protectedvoid onCreate(Bundle savedInstanceState) {

                   super.onCreate(savedInstanceState);

                   setContentView(R.layout.activity_youhua);

                   context=this;

         }

}

2:单利模式导致的内存泄漏

3:属性动画导致的内存泄漏

   属性动画中有一类无限循环的动画,若在Activity的onDestory中没有去停止该动画,那么动画会一直播放下去,尽管已经无法在界面上看到动画。将会导致以下问题,播放动画的view被动画持有,而view有持有了Activity,最终Activity无法释放。解决办法是在Activity的onDestory方法中停止动画(animator.cancle())。

listview优化

主要在adapter中getView方法进行优化。

@Override

public View getView(int position, ViewconvertView, ViewGroup parent)

{

         if(convertView==null)

         {

                   convertView= minflater.inflate(R.layout.item_task_listview, parent, false);

                   ViewHolderholder=new ViewHolder(convertView);

                   convertView.setTag(holder);

         }

         ViewHolderholder=(ViewHolder) convertView.getTag();

         initDate(position,holder);

         returnconvertView;

}

        

public void initDate(intposition,ViewHolder holder)

{

         TaskPoliceBeantb =mlists.get(position);

         holder.taskName.setText(tb.taskName);

         holder.crimeAddr.setText(tb.crimeAddr);

         holder.deliveryTime.setText(tb.deliveryTime);

}

private static class ViewHolder{

         @ViewInject(R.id.taskName)

         TextViewtaskName;

         @ViewInject(R.id.crimeAddr)

         TextViewcrimeAddr;

         @ViewInject(R.id.deliveryTime)

         TextViewdeliveryTime;

         publicViewHolder(View convertView) {

                   super();

                   ViewUtils.inject(this,convertView);

         }

}

Bitmap优化

参考bitmap的高效加载。

线程优化

采用线程池,避免程序中存在大量的线程。因为线程池可以重用内部的线程,从而避免了线程创建跟销毁所带来的性能的消耗。同时线程池能有效的控制线程的最大并发数,避免大量线程因相互抢占系统资源从而导致阻塞现象发生。

一些性能优化建议

1.      常量使用static final来修饰

2.      多使用Android特有的数据结构,如SparseArray,Pair,因为它们有更好的性能。

3.      适当使用软应用和弱引用。

4.      使用内部类时,尽量采用静态内部类,可以避免由于内部类而导致的内存泄漏。

推荐使用内存泄漏工具来分析内存使用情况(MAT 工具 Eclipse Memory Analyzer)

下载地址:http://www.eclipse.org/mat/downloads.php

你可能感兴趣的:(android,性能优化,合并,布局)