我們都知道應該避免在onDraw()方法里面執行導致內存分配的操作,下面講解下為何需要這樣做。
首先onDraw()方法是執行在UI線程的,在UI線程盡量避免做任何可能影響到性能的操作。雖然分配內存的操作并不需要花費太多系統資源,但是這并不意味著是免費無代價的。設備有一定的刷新頻率,導致View的onDraw方法會被頻繁的調用,如果onDraw方法效率低下,在頻繁刷新累積的效應下,效率低的問題會被擴大,然后會對性能有嚴重的影響。
如果在onDraw里面執行內存分配的操作,會容易導致內存抖動,GC頻繁被觸發,雖然GC后來被改進為執行在另外一個后臺線程(GC操作在2.3以前是同步的,之后是并發),可是頻繁的GC的操作還是會影響到CPU,影響到電量的消耗。
那么簡單解決頻繁分配內存的方法就是把分配操作移動到onDraw()方法外面,通常情況下,我們會把onDraw()里面new Paint的操作移動到外面,如下面所示: