博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android性能优化问题总结
阅读量:5906 次
发布时间:2019-06-19

本文共 2335 字,大约阅读时间需要 7 分钟。

  性能优化这块,分为UI性能优化、内存优化、数据库优化、网络优化、耗电优化等等。可以从1.如何发现问题,2.怎么解决问题,3.解决效果对比,这几个方面去描述。举个简单例子——UI优化,可以从 UI出现什么问题(卡顿不流畅),怎么查找问题(手机开发者权限>GPU过度绘制 发现层级问题,TraceView CPU使用情况分析),怎么解决问题(降低层级、自定义View绘图出现问题等),解决问题后性能再次对比。

一、UI优化

a.合理选择RelativeLayout、LinearLayout、FrameLayout,RelativeLayout会让子View调用2次onMeasure,而且布局相对复杂时,onMeasure相对比较复杂,效率比较低,LinearLayout在weight>0时也会让子View调用2次onMeasure。LinearLayout weight测量分配原则。

b.使用标签

c.减少布局层级,可以通过手机开发者选项>GPU过渡绘制查看,一般层级控制在4层以内,超过5层时需要考虑是否重新排版布局。

d.自定义View时,重写onDraw()方法,不要在该方法中新建对象,否则容易触发GC,导致性能下降

e.使用ListView时需要复用contentView,并使用Holder减少findViewById加载View。

f.去除不必要背景,getWindow().setBackgroundDrawable(null)

g.使用TextView的leftDrawabel/rightDrawable代替ImageView+TextView布局

二、内存优化

主要为了避免OOM和频繁触发到GC导致性能下降

a.Bitmap.recycle(),Cursor.close,inputStream.close()

b.大量加载Bitmap时,根据View大小加载Bitmap,合理选择inSampleSize,RGB_565编码方式;使用LruCache缓存

c.使用 静态内部类+WeakReference 代替内部类,如Handler、线程、AsyncTask

d.使用线程池管理线程,避免线程的新建

e.使用单例持有Context,需要记得释放,或者使用全局上下文

f.静态集合对象注意释放

g.属性动画造成内存泄露

h.使用webView,在Activity.onDestory需要移除和销毁,webView.removeAllViews()和webView.destory()

备:使用LeakCanary检测内存泄露

三、响应速度优化

Activity如果5秒之内无法响应屏幕触碰事件和键盘输入事件,就会出现ANR,而BroadcastReceiver如果10秒之内还未执行操作也会出现ANR,Serve20秒会出现ANR 为了避免ANR,可以开启子线程执行耗时操作,但是子线程不能更新UI,因此需要Handler消息机制、AsyncTask、IntentService进行线程通信。

备:出现ANR时,adb pull data/anr/tarces.txt 结合log分析

四、其他性能优化

a.常量使用static final修饰

b.使用SparseArray代替HashMap

c.使用线程池管理线程

d.ArrayList遍历使用常规for循环,LinkedList使用foreach

e.不要过度使用枚举,枚举占用内存空间比整型大

f.字符串的拼接优先考虑StringBuilder和StringBuffer

g.数据库存储是采用批量插入+事务

 

1、

第一篇简单回顾java的内存区域划分、引用、内存泄露以及场景,还有垃圾回收

2、

第二篇主要是使用过Android Studio自带工具Memory Monitor 检测内存泄露

3、

接上一篇,介绍另外一种内存泄露的检测工具MAT

4、

学习一下Android渲染机制,为什么16ms没完成绘制就会卡顿?

5、

Allaction Tracing是追踪内存分配的工具,可以很直观的看到某个操作是如何一步步分配的

6、

TraceView 是 Android 平台特有的数据采集和分析工具,主要用做热点分析,找出最需要优化的点。我就是靠它将我公司的项目的启动速度明显的提高了。

7、

StrictMode意思为严格模式,是用来检测程序中违例情况的开发者工具。使用一般是场景是检测主线程中本地磁盘和网络读写等耗时的操作。注意这个StrictMode是在Anroid2.3以后引入的。严格模式主要检测两大问题,一个是线程策略,即TreadPolicy,另一个是VM策略,即VmPolicy。

8、

介绍如何统计应用的启动时间和性能检查项,并且用TraceView逐个修复

9、

因为启动页一般View的数量比较少,业务逻辑比较简单,启动不太费劲,但是该怎么写启动页面让应用的启动速度更快呢?

10、

Android系统每隔16ms就重新绘制一次Activity,如果没有完成就会有丢帧的现象。为了减轻UI绘制的负担,有必要把Layout编写的一些注意事项总结一下

11、

说到应用的流畅度,都会想到FPS,FPS评测应用流畅度不准确,系统获取FPS的原理是:手机屏幕显示的内容是通过Android系统的SurfaceFLinger类,把当前系统里所有进程需要显示的信息合成一帧,然后提交到屏幕上进行显示,FPS就是1秒内SurfaceFLinger提交到屏幕的帧数。但是用FPS来评测一个应用是否真的卡顿存在两个问题,我们可以使用Choreographer帧率检测。

转载地址:http://cpcpx.baihongyu.com/

你可能感兴趣的文章
网站运营服务商选择
查看>>
javascript split函数讲解
查看>>
模拟redolog损坏,删除损坏并添加新的redolog
查看>>
Parallels安装Kali2.0遇到的问题及解决办法
查看>>
JAVA死锁和避免死锁
查看>>
我的友情链接
查看>>
使用FileSystem API读取数据
查看>>
Jboss4集群配置之一:前言与集群知识
查看>>
Objective-C内存管理和原理
查看>>
角点检测(1)Moravec's 算子
查看>>
Adapter之BaseAdapter使用
查看>>
CMDB项目之监控模板template设计
查看>>
linux动态库路径配置
查看>>
map这个小妖精(*/ω\*)
查看>>
Java 9,OSGi以及模块化的未来
查看>>
Android笔记:onSaveInstanceState和onRestoreInstanceState总结
查看>>
Apache 配置HTTPS协议搭载SSL配置
查看>>
远程访问×××-Easy ×××-router
查看>>
我的友情链接
查看>>
jquery ajax 向后台传递数组参数
查看>>