活用Activity/Fragment生命週期

做Android 的應該沒有人不知道這兩張圖的吧:

Activity:

Fragment:

在做第一個項目的時候,我習慣性的做法是在oncreate()方法裏把xml裏面我要用到的所有控件find出來(不知道有麼有人跟我一樣乾的~~):

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_take_photo);
        initview();
    }
    private void initview() {
    findViewById(R.id.takephotobutton).setOnClickListener(this);
        findViewById(R.id.photoablumbutton).setOnClickListener(this);
        findViewById(R.id.photoablumclip).setOnClickListener(this);
        takephoto=(ImageView) findViewById(R.id.takephoto);
    }

上面我通過findViewById獲取到的控件只要4個,看不出來有什麼問題,那如果xml裏面我們接下來需要用到的控件有20個 ,30個,如果我們依然像這樣來寫,最後出現的結果就是我們發現,在加載這個界面的時候,感覺到明顯變慢了,出現了明顯的卡頓加載不流暢,查看所有方法還找不出來原因,不用懷疑,就是這裏的問題啦,至於原因,有興趣的可以看看findViewById的原理,其實從上面圖可以看到 oncreate方法是activity 的入口,這個方法用於做一些初始化工作,執行onstart方法這個時候我們可以理解爲activity已經顯示出來,但是我們還看不見(處於後臺),只有執行到onresume方法,這個時候activity才真正的顯示出來,說到這裏,上面出現的卡頓也就好理解了,我們在activity還沒顯示出來的時候就進行大量的查找操作,自然會拖慢activity顯示出來的時間,從我們肉眼來看,就是加載變慢了。

解決方法就是:活用activity的生命週期,在onCreate方法裏儘量少做操作,除了那些必須馬上要用到的或者必須第一時間顯示的,其他的一些操作,我們可以選擇放到onStart() ,onResume()方法裏(這個辦法同樣適用於fragment);

在我們通過startActivity(intent)啓動另一個activityB的時候,不知道有沒有盆友想過當前activityA是否是執行完了onDestroy()方法後才顯示activityB 了?答案是否!

這裏不再貼圖了,具體過程有興趣可以試一試,其實activityB的onResume()方法只有在activityA的onPause()方法執行完之後纔會執行,在具體一點就是:只有activityA執行完了onPause()方法activityB纔會顯示出來。所以說如果activityA 要打開activityB ,那麼最好不要在onPause()方法裏做過多的耗時操作,這樣也是會拖慢activity顯示出來的時間,造成卡頓

當然造成應用卡頓的原因有很多,這裏只是根據生命週期提出的一些方法,如果文中有什麼不對的或者有盆友有更好的辦法,歡迎提出來~~

最後在說點題外話,現在我們可以通過依賴注入框架(關於流行的框架,有興趣可以看看)來替代findViewById的調用,這樣可以減少代碼量,so good

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章