自定義的View一般都不是靜態的,所以都需要對其進行刷新:
根據實際使用的不同場合需要采用不同的刷新策略,下面是三種常用的刷新方式:
- 不使用多線程和雙緩沖
這種情況一般使用在不需要頻繁刷新的情況下,只需顯式地調用View中的invalidate()方法系統會自動調用View的onDraw()方法。 -
使用多線程但不使用雙緩沖
這種情況需要開啟新的線程,但是我們知道如果在非UI線程中訪問View對象就會報如下錯誤:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
這時候就需要結合Handler來處理了,只要新建一個Handler,在新線程創建並發送一個Message,然后再主線程中捕獲、處理該消息。
-
使用多線程和雙緩沖
這個就是通過SurfaceView來實現的,我們在繪圖專題中已經對SurfaceView進行介紹了,大家可以翻閱之前的博文,查看。
Android中實現view的更新有兩組方法,一組是invalidate,另一組是postInvalidate,其中前者是在UI線程自身中使用,而后者在非UI線程中使用。
Android提供了Invalidate方法實現界面刷新,但是Invalidate不能直接在線程中調用,因為他是違背了單線程模型:Android UI操作並不是線程安全的,並且這些操作必須在UI線程中調用。
Android程序中可以使用的界面刷新方法有兩種,分別是利用Handler和利用postInvalidate()來實現在線程中刷新界面。