Android 性能优化

来源:互联网 发布:java面向对象小项目 编辑:程序博客网 时间:2024/06/01 07:38

最近闲来拜读了任玉刚大神的《Android开发艺术探索》这本书,总结了几点,方便以后查阅。
1、布局优化
尽量减少布局文件 的层级,布局减少了那么安卓绘制的工作就减少了;
方法:
1.1 尽量少采用RelativeLayout,因为RelativeLayout的计算量相对于Linearlayout还是大的。但是如果Linearlayout无法实现布局,需要增加层级,那么还是使用RelativeLayout;FrameLayout 和Linearlayout,都是高效的ViewGroup;
1.2 采用include标签和merge标签和ViewStub;
include标签的使用方法:

<include layout="@layout/title"/>

以上代码通过layout 将一个布局文件引用到这个布局中;提供的属性有id,weidth,height;如果在属性中指定了 android:layout_*,这种的属性那么我们就必须提供weidth,height这两个属性了。如果没有使用就不需要提供这两个属性;
merge标签的使用方法

<merge xmlns:android="http://schemas.android.com/apk/res/android"              android:layout_width="match_parent"              android:layout_height="match_parent"              android:orientation="horizontal">    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="登录"/>    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="登录"/>    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="登录"/>    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="登录"/></merge>

通常我们都是使用include和merge这个两个标签来减少引用布局的层级,但是这里有一个缺陷,就是在引用布局中我们采用的是LinearLayout布局,那么我们在主布局中也是用的是LinearLayout,当两者的排列方向一致时没有问题吗,那么当两个不同时,merge中的空间显示的使用会采用主布局文件的方式来显示,所以这时就产生了问题。
ViewStub的使用

<!--view_stub是ViewStub的id,而import_lin是view_import跟布局的id-->    <ViewStub        android:id="@+id/view_stub"        android:inflatedId="@id/import_lin"        android:layout="@layout/view_import"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/>

ViewStub继承自View,是非常轻量级的宽高都为0,不参与任何布局的计算过程,只需要在需要的时候加载,比如在网络请求失败的时候显示;
设置显示的两种方式

//设置ViewStub显示的两种方式一:findViewById(R.id.view_stub).setVisibility(View.VISIBLE);//方法二:View viewById = ((ViewStub)findViewById(R.id.view_stub)).inflate();

暂时不支持merge标签;
2、绘制优化
在onDraw中避免大量的操作;
2.1 不在onDraw方法中做大量的耗时操作,或者成千上万的循环操作;
2.2 不在onDraw方法中创今年局部变量;onDraw频繁的被调用,会产生大量的临时对象,增加CPU压力,并且导致频繁的GC;
3、内存泄漏优化
内存泄漏是我们经常不注意或者经常犯的错误,优化主要从两个方面着手
a、开发中避免写出内存泄漏的代码
b、通过常见的内存泄漏检测工具检测出并且解决*
那么如何避免写出内存泄漏的代码呢?主要注意以下几个方面
3.1 静态变量引起的内存泄漏
一个静态变量持有当前Activity,导致当前的Activity无法释放;
3.2 单例模式导致的内存泄漏
单例模式的生命周期保持和Application一样的生命周期,当我们采用了注册,一定要有解注册的方法;不然会导致当前的Activity被引用无法释放;
3.3 属性动画导致的内存泄漏
3.0后提出了属性动画,当我们在属性动画中引用无线播放的动画时,该动画引用了View,而View又持有当前的Activity,导致Activity无法被释放,我们应该在onDestroy()方法调用停止动画播放的方法;
3.4 相应速度优化和ANR日志
避免在主线程中做耗时操作;
在Activity中如果超过5秒无法响应屏幕的触摸事件或者键盘的输入事件,就会导致ANR的产生;
BroadCastReceiver响应超过10秒也会产生ANR;
3.5 ListView和Bitmap异常
当ListView快速滑动的时候不适用开启大量的异步操作,为了使滑动的更加流畅我们可以尝试采取硬件加速的方法;
Bitmap加载图片采取BitmapFactory.options();设置insimpleSize();方法压缩减少资源的占用;
3.6 线程优化
避免在程序中开启大量的Thread,可以采取线程池来管理,并且线程池还可以最大限度的控制线程的最大的并发数,避免线程因为抢占系统资源产生阻塞的现象;
4、建议
4.1 避免创建过多的对象;
4.2 不要过多的使用枚举;
4.3 常量使用static finial修饰;
4.4 适当的使用弱引用和软引用;
4.5 尽量使用内存缓存或磁盘缓存;
4.6 尽量采用静态内部类,避免因为内部类造成的内存泄漏;

1 0
原创粉丝点击