3.SurfaceView與多執行緒的混搭
上一篇簡單介紹了SurfaceView的基本使用,這篇就介紹SurfaceView與多執行緒的混搭。SurfaceView與多執行緒混搭,是為了防止動畫閃爍而實現的一種多執行緒應用技術。android的多執行緒用法與Java的多執行緒用法完全一樣,本文不做多執行緒方面的介紹了。直接講解SurfaceView與多執行緒的混合使用,即開一條執行緒專門讀取圖片,另外一條執行緒專門繪圖。
先看效果圖,左邊是開單個執行緒讀取並繪圖,右邊是開兩個執行緒,一個專門讀取圖片,一個專門繪圖:
對比一下,右邊動畫的幀速明顯比左邊的快,左右兩者都沒使用Thread.sleep()。為什麼要開兩個執行緒一個讀一個畫,而不去開兩個執行緒像左邊那樣都“邊讀邊畫”呢?因為SurfaceView每次繪圖都會鎖定Canvas,也就是說同一片區域這次沒畫完下次就不能畫,因此要提高動畫播放的效率,就得開一條執行緒專門畫圖,開另外一條執行緒做預處理的工作。
main.xml的原始碼:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<? xml version = "1.0" encoding = "utf-8" ?>
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:orientation = "vertical" >
< LinearLayout
android:id = "@+id/LinearLayout01"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content" >
< Button
android:id = "@+id/Button01"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content" android:text = "單個獨立執行緒"
/>
< Button
android:id = "@+id/Button02"
android:layout_width = "wrap_content"
|