原始碼分析之LayoutInflater

2021-07-26 21:44:17 字數 1398 閱讀 2671

簡介

inflate填充的過程

viewstub,merge,include的載入過程

layoutinflater系統服務的註冊過程

systemserviceregistry類有個靜態**塊,完成了常用服務的註冊,**如下

static});

// 註冊am

registerservice(context.activity_service, activitymanager.class,

new cachedservicefetcher() });

// 註冊wm

registerservice(context.window_service, windowmanager.class,

new cachedservicefetcher() });

// 等等

}

接下來我們看inflate過程,下面是整個inflate過程

public view inflate(xmlpullparser parser, @nullable viewgroup root, boolean attachtoroot) 

// 這裡判斷是否是第乙個view節點

if (type != xmlpullparser.start_tag)

final string name = parser.getname();

// 解析merge標籤

if (tag_merge.equals(name))

// 通過rinflate方法將merge標籤下的孩子直接合併到root上,這樣減少一層布局,達到減少viewtree的目的

rinflate(parser, root, inflatercontext, attrs, false);

} else

}// 通過深度遍歷temp下的節點,之後將節點依次新增到剛剛通過反射建立的temp物件上,因為採用的是深度優先遍歷演算法,因此viewtree的層級很深的話,會影響遍歷的效能

rinflatechildren(parser, temp, attrs, true);

// 判斷剛剛建立的temp物件是否新增到父節點上.

// 滿足兩個條件1 父節點(root)不為null,2 attachtoroot=true

if (root != null && attachtoroot)

// 設定result

if (root == null || !attachtoroot)

}} catch (xmlpullparserexception e) catch (exception e) finally

// 返回

return result;

}

總結

原始碼分析之HashMap

首先hashmap繼承了abstractmap,並且實現了map cloneable和serializable三個介面。cloneable和serializable是比較常規的兩個介面,在這裡並不作為重點。重點將會放在abstractmap和map兩個規範上。其中abstractmap是乙個抽象類,...

原始碼分析之String

先看屬性 底層是char陣列,一目了然 可以看到,value是儲存string的內容的,即當使用string str abc 的時候,本質上,abc 是儲存在乙個char型別的陣列中的。string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value...

STL原始碼分析之Vector

地球人都知道vector的查詢效率很高,插入和刪除的效率低下,容器會隨著元素的不斷增加自動增長,最近在看了stl原始碼之後,發現確實是這樣,下面是vector一些關鍵的函式.從這些函式可以看出插入和刪除的過程,以及容器自動增長的方式.兩個通過下標獲取元素的函式.reference operator ...