天天看點

安卓ondraw重新整理視圖_Android View 繪制重新整理流程分析

Android中對View的更新有很多種方式,使用時要區分不同的應用場合。

1.不使用多線程和雙緩沖

這種情況最簡單,一般隻是希望在View發生改變時對UI進行重繪。你隻需顯式地調用View對象中的invalidate(){關于invalidate的解釋:當調用線程處于空閑狀态時,會調用onDraw,重新整理界面,也就是說,該函數僅是标記目前界面過期,并不直接負責重新整理界面;}方法即可。系統會自動調用View的onDraw()方法。

2.使用多線程但不使用雙緩沖

這種情況需要開啟新的線程,新開的線程就不好通路View對象了。強行通路的話會報:android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.

這時候你需要建立一個繼承了android.os.Handler的子類,并重寫handleMessage(Message msg)方法。android.os.Handler是能發送和處理消息的,你需要在Activity中發出更新UI的消息,然後在Handler(可以使用匿名内部類)中處理消息(因為匿名内部類可以通路父類變量, 你可以直接調用View對象中的invalidate()方法 )。也就是說:在新線程建立并發送一個Message,然後再主線程中捕獲、處理該消息。

3.使用多線程和雙緩沖

Android中SurfaceView是View的子類,她同時也實作了雙緩沖。可以定義一個她的子類并實作SurfaceHolder.Callback接口。由于實作SurfaceHolder.Callback接口,新線程就不需要android.os.Handler幫忙了。SurfaceHolder中lockCanvas()方法可以鎖定畫布,繪制完新的圖像後調用unlockCanvasAndPost(canvas)解鎖(顯示)

先看看源代碼對SurfaceHolder接口的描述