一、页面启动优化:
页面启动慢主要有2种页面渲染慢和java代码初始化慢的问题。
页面渲染:
1、最少布局嵌套
布局嵌套渲染极其耗时,减少不必要的嵌套就能大大提高启动速度。原理可参照view的渲染过程
新版本谷歌推荐ConstraintLayout布局,该布局能只有一层布局就能界面绘制。但是对于简单的使用releactionLayout和LinearLayout布局,简单的绘制,这两者性能更好。
三者对比:
同深度:LinearLayout>releactionLayout>ConstraintLayout 三者的差距主要在onMeasure
同布局:ConstraintLayout>releactionLayout>LinearLayout ConstraintLayout能够有效减少页面嵌套
使用merge:对于不需要background,布局的。可以使用merger,减少一层嵌套
使用ViewStub: 对于不需要立即加载的布局,可以使用ViewStub。不会立即渲染
2、减少大文件,主要大图片,有必要的可以压缩(150K以下)
代码初始化化:
除了必要不耗时的findId操作,尽量放在异步线程处理
使用Fragment代替Activity,甚至,注册广播,注销广播,获取imei,读取空文件,这些也要放在子线程
App启动慢
除了首页优化外,application初始化数据放在异步线程,需要使用的变量使用同步锁,防止为初始化完毕
对于首个加载的Activity,可以使用透明背景:可以减少application加载主题的消耗
<style name= "EmptyTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
</style>
然后,在onCreate第一行执行:setTheme(R.style.AppTheme);
使用线程池
大量的线程调用,频繁的线程调度,会降低系统的性能。对于使用的异步任务,只使用一个线程池,能够有效的提高加载效率。
使用IDLE
Looper.myQueue.addIdleHander该方式利用了当UI线程无任何消息需要处理的时候,在其空闲时候执行相关业务。对于一些布局实时性不是特别高的场景下使用,
strict mode
监测一切不合规的操作,主要是主线程的耗时操作,内存泄露
策略:
在baseActivity中,oncreat方法加入:
if(MyApplication.isDebug()){
StrictMode.setThreadPolicy(new
StrictMode. ThreadPolicy.detectAll.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.detectAll.penaltyLog().build())
}
只能在debug中加入严格模式监测策略,会严重影响性能。
这样出现违规时就会输出相应的日志。根据log排查问题。
常见的耗时操作
1、SharePreference的commit方法
2、文件读取
3、json解析等算法复杂度高的操作
4、所有跨进程通信,binder进程的原因,导致简单的方法也会卡顿
① 账号信息的读写(AccountManager)
②TelePhoneManage
③其他SystemManager(获取imei,手机号简单的方法也会anr)
网友评论