开发安卓程序是件劳心劳力的事,用户体验越来越重要的当今形式逼迫着我们不断提高app性能。踩在巨人的肩膀上,这一篇来扯一扯如何优化我们的app。
1:布局优化
1.1减少布局嵌套的层级,删除无用的group
屏幕信息的显示过程就像是树的层级遍历的过程,先画最底层,然后逐层往上画。那么,树高过大显然是不利于性能的,
使用include标签将一个指定的布局文件加到当前的布局文件中。
1.3merge
常与include组合使用,可删除多余的视图组。
1.4viewStep
viewStep大小为零,本身不参与任何的布局和绘制流程。其意义在于可以按需加载所需的布局文件。
<ViewStub
android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
stub_import为viewStub的id,panel_import是proress_overlay的跟布局id
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
使用时iewStub会被它内部的布局替换掉。
2:绘制优化:
绘制过程严禁耗时操作,耗时操作会引起页面卡顿,降低体验度。有人说万一有耗时的任务怎么办,后台加载然后异步通知。
3:内存泄漏优化
如静态变量引起的内存泄漏,单例模式引起的内存泄漏,属性动画引起的内存泄漏,handler引起的内存泄漏等。
对于handler引起的内存泄漏,handler,message,messageQueue是连在一起的,如果handler发送的消息未被处理,则handler,消息将一直呆在消息队列中而无法释放。所以这就很坑了 ,如果handler延迟个十分钟再发消息,而activity早早关闭了,handler所在的activity也无法被回收。造成内存泄漏
解决方案:避免使用非静态内部里,使用静态内部类+软引用的方式,详情请查看
4:listView优化
目前listView,GridView,逐渐被recycleView所替代,但不管是何种view,优化的思路不会过时。在与获取视图相关的方法中应尽量避免耗时操作,耗时操作请使用后台加载+异步刷新的方式,可以尝试开启硬件加速。
5:线程优化
线程池能减少多个线程创建和销毁时的内存开销,同时有效的避免因争抢资源所引起的阻塞现象。池被用来管理内部资源,
关于Android中的线程池,请查看
最后MAT工具是一款强大的内存泄漏分析工具。