1. 程式人生 > >Android面試題(2018.11.16)

Android面試題(2018.11.16)

一、UI的繪製過程,常見優化手段以及原理。

二、有幾種常見的單例模式?對於這幾種單例模式synchronized具體鎖的是什麼東西?

三、問記憶體優化你做過沒有?一張十萬乘以十萬的圖片,如何載入才不會記憶體溢位?

四、問記憶體溢位,記憶體抖動,記憶體洩漏你都碰到過嗎?怎麼解決的?如何區分這幾種情況?怎麼解決由記憶體洩漏而導致的記憶體溢位?

五、簡述Rxjava的原理。

六、問Handler原始碼分析。

一、UI的繪製過程,常見優化手段以及原理。

(一)UI的繪製過程:

相關文章:

一篇文章教你讀懂UI繪製流程

總結:

  • (1)、在ActivityThread啟動時,通過一些列的呼叫,首先將我們的VIew交給了WindowManager,然後呼叫windowManager.addView(view,layoutParams)(第一個引數是view,第二個引數是佈局引數)。
  • (2)、進入addView之後我們發現了一段這樣的程式碼,他將檢視,和引數還有我門的一個ViewRoot物件都用了容器去裝在了起來,那麼在此處我們可以得出,是將所有的相關物件儲存起來。
  • (3)、UI繪製先回去測量佈局,然後在進行佈局的擺放,當所有的佈局測量擺放完畢之後,進行繪製。

UI是如何繪製的?

在ActivityThread啟動時, 我發現在載入handleLaunchActivity方法呼叫performLaunchActivity方法之後又呼叫了一個handleResumeActivity在這裡我發現了繪製流程的開始

通過前面的流程我門知道,onCreate之行完成之後,所有資源交給WindowManager保管

在這裡,將我們的VIew交給了WindowManager,此處呼叫了addView

進入addView之後我們發現了一段這樣的程式碼,他將檢視,和引數還有我門的一個ViewRoot物件都用了容器去裝在了起來,那麼在此處我門可以得出,是將所有的相關物件儲存起來

mViews儲存的是View物件,DecorView

mRoots儲存和頂層View關聯的ViewRootImpl物件

mParams儲存的是建立頂層View的layout引數。

而WindowManagerGlobal類也負責和WMS通訊

而在此時,有一句關鍵程式碼root.setView,這裡是將我們的引數,和檢視同時交給了ViewRoot,那麼這個時候我們來看下ViewRoot當中的setView幹了什麼

終於在這裡讓我發現了讓我明白的一步

在這裡我門會看到view.assignParent的設定是this, 那麼也就是說在view當中parent其實實際上是ViewRoot

那麼在setContentView當中呼叫了一個setLayoutParams()是呼叫的ViewRoot的

而在ViewRoot當中發現了setLayoutParams和preformLayout對requestLayout方法的呼叫

在requestLayout當中發現了對scheduleTraversals方法的呼叫而scheduleTraversals當中呼叫了doTraversal的訪問,最終訪問到了performTraversals(),而在這個裡面,我發現了整體的繪製流程的呼叫

當前裡面依次是用了

UI繪製先回去測量佈局,然後在進行佈局的擺放,當所有的佈局測量擺放完畢之後,進行繪製。

至此整體UI繪製過程我們就已經非常清楚了。

我門可以根據這種繪製的流程來操作自己的自定義元件。

。。。。。結束。。。。。

 

UI繪製流程詳解(2)

Android UI測量、佈局、繪製過程探究

(二)常見的UI優化手段以及原理:

Android效能調優篇之UI佈局優化

一般來講,佈局出現問題的原因有兩點:

  • 一是佈局層次不合理;
  • 二是佈局存在過度繪製;

解決方案:

  • 1、使用Hierarchy Viewer工具檢測
  • 2、使用include 和merge標籤減少複用佈局而產生的佈局巢狀,使用ViewStub懶載入減少渲染元素
  • 3、診斷過度繪製,優化過度繪製

Android繪製優化內容總結避免過度繪製

Android介面效能優化最全總結、原理剖析,必讀!

【Android 效能優化】—— UI篇

二、有幾種常見的單例模式?對於這幾種單例模式synchronized具體鎖的是什麼東西?

單例模式全家福

(一)所有單例模式

(1)、餓漢式

public class Singleton {
    private static Singleton sInstance = new Singleton();
    private Singleton() {
    }
    public static Singleton getInstance() {
        return sInstance;
    }
}

(2)、懶漢式

public class Singleton {
    private static Singleton sInstance;
    private Singleton() {
    }
    public synchronized static Singleton getInstance() {
        if (sInstance == null) {
            sInstance = new Singleton();
        }
        return sInstance;
    }
}

(3)、雙重校驗鎖DCL(double checked locking)

public class Singleton {
    private static volatile Singleton sInstance;
    private Singleton() {
    }
    public static Singleton getInstance() {
        if (sInstance == null) {
            synchronized (Singleton.class) {
                if (sInstance == null) {
                    sInstance = new Singleton();
                }
            }
        }
        return sInstance;
    }
}

(4)、靜態內部類實現的單例模式

public class Singleton {
    private Singleton() {
    }
    public static Singleton getInstance() {
        return SingletonHolder.sInstance;
    }
    private static class SingletonHolder {
        private static Singleton sInstance = new Singleton();
    }
}

(5)、列舉單例

public enum SingletonEnum {
    INSTANCE;
    public void method(){
        // do something...
    }
}

(二)synchronized具體鎖的是什麼東西?

被鎖的程式碼塊叫作臨界區,只有獲取到鎖資源才能進入臨界區,進行相應的操作。

。。。。。。。。。。

設計模式-單例模式

設計模式(建立型)之單例模式(Singleton Pattern)

你見過這樣的單例模式嗎?

 

 

三、問記憶體優化你做過沒有?一張十萬乘以十萬的圖片,如何載入才不會記憶體溢位?

四、問記憶體溢位,記憶體抖動,記憶體洩漏你都碰到過嗎?怎麼解決的?如何區分這幾種情況?怎麼解決由記憶體洩漏而導致的記憶體溢位?

五、簡述Rxjava的原理。

六、問Handler原始碼分析。