今天来给你们分享一个性能优化的经验,主要在Activity启动方面。
众所周知,给用户即时的响应是加强移动设备用户体验的重要一环,而Activity在启动过程当中,又会经历至少onCreate(), onStart(), onResume()这三个回调过程。而在这三个过程当中,又会经历绘制界面、载入数据、恢复现场等等实际操做。这对于一个Activity的启动多少都是会产生影响的。
一般意义上讲,咱们去优化Activity的启动速度都是在上述三个回调中下工夫,以为只要上述操做优化得足够好,就能够有一个良好的体验。包括咱们在百度上面去搜索提高Activity启动速度也是如此。git
完整代码请见 完整代码github
接下来咱们来看这个问题的另外一个方面。下面先看一个动画:性能优化
咱们能够注意到,在点击了"Launch SecondActivity"后,界面卡住了几秒,才发生跳转。而SecondActivity自己什么都没有作,以下所示:ide
public class SecondActivity extends Activity {
private final String TAG = getClass().getSimpleName();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.d(TAG, "onCreate end");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart end");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume end");
}
}
复制代码
这是一个很极端的状况,在启动过程当中的各个生命周期,都只作了输出Log的操做,但仍然发生了卡顿的状况。 咱们看在启动它的Activity中,咱们作了什么:性能
@Override
protected void onPause() {
super.onPause();
sleep();
}
// Sleep 5000 ms in main thread.
private void sleep() {
if (needSleep) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
复制代码
在onPause()方法中,咱们作了一个5000ms的主线程延迟,用来模拟大量的主线程操做,咱们发现,一旦在onPause中工做量太大,也会致使接下来启动的Activity启动延迟。这也解释了为何咱们反复优化即将启动的Activity,却收效不大的缘由。
而一旦onPause()方法中,不进行操做时,或者实际项目中操做很少时,接下来的Activity会启动得很快,参考下面的演示:优化
但愿经过上面的描述,能给各位读者提供另外一个性能优化的方案。 Demo APK 和源码下载: github.com/wh1990xiao2…动画