如果有人還不了解ViewHolder為什么可以起到優化作用,
我這邊再做下簡單說明:
Android的findViewById動作是比較耗時的,需要遍歷布局的樹形結構,才能找到相應的視圖。所以如果想在這一塊進行優化,我們就需要把find過后的內容進行緩存,所以就用ViewHolder的方法。
這個方法很容易理解,但是可能有些人還是比較較真,就像我,這樣可以起到緩存作用,那為什么內部類非得要聲明成static的呢,普通的內部類不是也起到這樣的效果嗎?這個疑問也困擾了我很久。直到我看了《Effective Java》這本書,才解開我這個困惑,原來這不是Android的優化,而是Java提倡的優化。
《Effective Java》第22條 優先考慮靜態成員類
其中有條建議:
如果聲明成員類不要求訪問外圍實例,就要始終把static修飾符放在它的聲明中,使它成為靜態成員類,而不是非靜態成員類。
因為非靜態成員類的實例會包含一個額外的指向外圍對象的引用,保存這份引用要消耗時間和空間,并且導致外圍類實例符合垃圾回收時仍然被保留。如果沒有外圍實例的情況下,也需要分配實例,就不能使用非靜態成員類,因為非靜態成員類的實例必須要有一個外圍實例。
PS:強烈推薦《Effective Java》這本書,會讓你有意想不到的收獲。