2018/5/21
工具
TraceView定位性能瓶颈,可以看见每个方法耗时、堆栈等,神器。
UI显示流程
预先有一个空白window
onResume后,new一个window,并且设置décor给window,然后开始绘制。绘制好后,window替换原来的空白window
splash(特殊机型、版本可能会失效,需要积累经验)
我们可以利用的第一个时间段
<style name="Splash" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash</item>
</style>
<activity android:name=".MainActivity" android:theme="@style/Splash"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
@Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
onResume的MessageIdle
我们可以利用的第二个时间段
@Override protected void onResume() { super.onResume(); Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() { @Override public boolean queueIdle() { //耗时操作 return false; } }); }
Multidex
https://blog.youkuaiyun.com/qq_36523667/article/details/80329077
插件apk,像微信小程序一样,使用的时候再下载,加载,很不错。主apk一般都是启动所必须的类。
UI优化
理想的启动时仅仅绘制UI,把UI以外的逻辑放到合适的时间执行。但是UI事实上也是越快越好,不是吗?可以看我的渲染优化手册
第三方组件
在合理的时间段内初始化
子线程的科学使用
他也消耗时间片,所以你需要给他设置优先级,在合适的时候给以合适的可获得的时间片大小的约束
cache策略
数据库cache,在UI显示后,显示的数据是数据库的,或者是一些默认数据,然后才是网络请求后得来的最新数据。
打包策略
如果要在UI绘制阶段进行网络请求,请尽量打包他们
业务逻辑策略
比如splash,可以先显示本地的,UI显示后再下载,然后cache到本地,下次进入的时候再使用新的
线程池
开销不小,在启动的时候,使用需谨慎。网络请求会创建线程池,所以网络请求能延时自然是最好。
SharedPreferences
IO操作都是耗时大户,别看他比sqlite轻量就忽视他。经过检测保存一个boolean变量耗时120+毫秒以上。