Android的性能优化

26 篇文章 0 订阅

布局优化

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 extends Activity {
         staticContext context;
         @Override
         protecte dvoid 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);
         }
         ViewHolder holder=(ViewHolder) convertView.getTag();
         initDate(position,holder);
         return convertView;
}
        
public void initDate(intposition,ViewHolder holder)
{
         TaskPoliceBean tb =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)
         TextView taskName;
         @ViewInject(R.id.crimeAddr)
         TextView crimeAddr;
         @ViewInject(R.id.deliveryTime)
         TextView deliveryTime;
         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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值