今天來給你們分享一個性能優化的經驗,主要在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…動畫