启动APP时的问题
在构建App时, 经常需要引入一些第三方的SDK,而项目业务越多,引用的第三方也越多,有些第三方会要求在Application的onCreate方法中对其初始化。 这意味着在application的onCreate方法中执行时间会被拉长,首个Activity布局的渲染时间也会相应地拉长。
同理,如果我们在Activity的onCreate,onStart,onResume方法中执行的任务时间过长,同样也会导致布局被渲染的事件拉长。这样导致的问题就是用户会感觉页面迟迟没有加载出来,用户体验极差。
启动时间检测
adb shell am start -W xxx/.XXXActivity
// 运行结果
ThisTime:最后一个Activity的启动时间
TotalTime:一系列Activity的启动时间
WaitTime:总启动时间,包含系统在冷启动的时候,需要加载app信息到内存的时间(系统决定,对开发者来说是不可控的)
如下图所示,启动com.chat.room.MainActivity的耗时情况
代码执行时间统计
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
File file = new File(Environment.getExternalStorageDirectory(), "app.trace");
Log.d(TAG, "onCreate: file.absolutePath = " + file.getAbsolutePath());
Debug.startMethodTracing(file.getAbsolutePath());
init();
Debug.stopMethodTracing();
}
private void init(){
a();
b();
}
private void a(){
new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
b();
}
private void b(){
new Thread(){
@Override
public void run() {
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
在init方法开始之前,结束之后,分别调用Debug的方法。然后我们就会得到一个trace文件。通过命令adb pull /storage/emulated/0/app.trace
将trace下载到本地,然后通过AndroidStudio打开。将会是如下所示:
从图中我们可以看到每个方法的耗时时间。
也可以切换到“Top Down”模式,查看耗时最多的方法。
解决办法
方式一:可以放在子线程的工作,放在子线程处理。但是需要注意
子线程使用的API不能创建Handler
不能有UI操作
对异步要求不高。
方式二:懒加载
何时使用,何时初始化。
总结
代码优化的目的就是减少代码耗时时间,能放在子线程执行的放在子线程执行。或者通过懒加载的方式缓解初始化的压力。