Android 性能优化

来源:互联网 发布:tensorflow spark 编辑:程序博客网 时间:2024/06/08 13:22

Android 性能优化的重要性就没必要说了,这里主要介绍性能优化的一些方法.
主要包括:布局优化,绘制优化,内存泄漏优化,响应速度优化,listView优化,Bitmap优化,线程优化和性能优化.
下面我们一个一个来分析:

1.布局优化: 思想就是尽量的来减少布局的层级结构来达到优化的目的地.

首先:删除无用的层级和选择性能较低的ViewGroup(例:既可以使用RelativeLayout又可以使用LinearLayout时选用LinearLayout,因为RelativeLayout功能复杂,布局时会需要更多的CPU时间等,FrameLayout和LinearLayout都是简单高效的)

ps:不要因为LinearLayout高效就用两个嵌套那样还不如一个RelativeLayout.

其次:使用<include>\<merge>\<ViewStub>标签

<include>的使用:可以将布局重复使用来代替写相同的代码,另外它只支持android:layout_开头的属性(android:id是个特例),其中如果include标签指定了id并且被包含的内容(下面代码中的merge内容)的根布局也指定了id时,以的id为准,最后如果指定了android:layout_*属性,那么android:layout_width和android:layout_height必须同时存在(直接用例子来说明):

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    <include layout="@layout/titlebar"/>    <Button        android:text="button"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout><!--titlebar--><merge xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    <include layout="@layout/titlebar"/>    <Button        android:text="button"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></merge>

<merge>的使用 : 一般用于和<include> 搭配来使用.直接看上面的例子即可. 因为外层是一个LinearLayout这时候如果里面也用一个LinearLayout这样就会增加布局的层级,而且两个根布局作用是一样的,所以用<merge> 来代替LinearLayout最为合适.

<ViewStub>的使用: ViewStub extends View ,并且宽\高都是0.这样情况下它本身就不参与任何布局的绘制了.

意义:按需加载所需的布局文件, 在实际的开发中例如:网络异常情况下,界面就没必要加载了,ViewStub就可以实现了,这样就可以提高性能.

<ViewStub     android:id="@+id/stubView"    android:inflatedId="@+id/other"    android:layout="@layout/supportView"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:layout_gravity="bottom"    xmlns:android="http://schemas.android.com/apk/res/android" />

看上面的代码,其中 stubView 是ViewStub的id,而 other 是layout/supportView布局的根元素的id.
按需加载的两种方式
1.((ViewStub) findViewById.(R.id.stubView)).setVisibilitv(View.VISIBLE);
2.View mOther = ((ViewStub) findViewById(R.id.stubView)).inflate();

2.绘制优化:目的就是避免onDraw()执行大量的操作
(1).在onDraw中不要创建新的局部对象,因为onDraw方法可能会被频繁的调用会导致产生大量的对象,不仅会占用过多的内存还会使系统更加频繁的gc,从而影响了效率
(2).onDraw中不要做耗时的任务,也不能做巨大量的循环操作(大量循环会很抢占CPU时间片,造成View绘制不流畅)

3.内存泄漏优化:
(1).开发中尽量避免写有内存泄漏的代码

01.静态变量导致:(static生命周期和Application同步,所以一直持有Activity的引用)    MainActivity        private static Context mContext;        onCreate(Bundle)-->{ mContext = this; } 02.单例模式导致:     例如在一些监听中需要了Activity对象,而在Activity销毁的时候忘记了调用相关方法来解除对Activity的占用,从而导致一直持有其对象 03.属性动画导致:   属性动画中的无线循环的动画,如果没有及时的在onDestory()中去停止动画,那么动画就会一直播放尽管界面上已经无法看到效果了,这时Activity的View会被持有,而View又持有Activity对象导致内存泄漏.所以要在onDestory()中来调用animator.cancle()来停止动画.

(2).通过一些工具(如MAT)来找出内存泄漏从而解决

4.响应速度,ANR分析
响应速度:避免在主线程中做耗时的操作,
ANR:Activity 在5s内无法响应就会触发ANR.
BroadcastReceiver在10s内还未执行完操作也会ANR

ANR日志分析: 导出traces文件 命令:adb pull /data/anr/traces.txt 来进行分析

5.ListView和Bitmap优化
ListView优化 : 使用ViewHolder,根据列表滑动状态来控制任务执行效率(例:快速滑动时不需要开启大量异步任务),可以尝试开启硬件加速
Bitmap优化: 稍后
6.线程优化:
采用线程池来避免程序中存在大量的Thread. 并且线程池可以避免线程的创建和销毁所带来的性能开销同时还可以控制最大的并发数量,避免了大量线程抢占资源导致阻塞的现象发生.

7.性能优化
避免创建过多的对象
不要过多的使用枚举(枚举的内存空间大于整型)
常量用static final来修饰
使用Android特有的数据结构(例:SparseArray,Pair等)
适当使用软引用和弱引用
采用缓存的策略(内存缓存和硬盘缓存)
尽量使用静态内部类可以避免由于内部类导致的内存泄漏


参考 : Android 开发艺术探索

0 0
原创粉丝点击