Android面試題(2018.11.16)
一、UI的繪製過程,常見優化手段以及原理。
二、有幾種常見的單例模式?對於這幾種單例模式synchronized具體鎖的是什麼東西?
三、問記憶體優化你做過沒有?一張十萬乘以十萬的圖片,如何載入才不會記憶體溢位?
四、問記憶體溢位,記憶體抖動,記憶體洩漏你都碰到過嗎?怎麼解決的?如何區分這幾種情況?怎麼解決由記憶體洩漏而導致的記憶體溢位?
五、簡述Rxjava的原理。
六、問Handler原始碼分析。
一、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優化手段以及原理:
一般來講,佈局出現問題的原因有兩點:
- 一是佈局層次不合理;
- 二是佈局存在過度繪製;
解決方案:
- 1、使用Hierarchy Viewer工具檢測
- 2、使用include 和merge標籤減少複用佈局而產生的佈局巢狀,使用ViewStub懶載入減少渲染元素
- 3、診斷過度繪製,優化過度繪製
二、有幾種常見的單例模式?對於這幾種單例模式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原始碼分析。