Jollen 的 Android Leak 開發解密, #2: Play Music in Secondary Thread

jollen 發表於 January 11, 2011 7:05 PM

根據先前所討論過的觀念,我們把 "play" music 的功能設計在 secondary thread 裡。Android SDK 使用 java.lang.Thread 來建立 thread,使用 secondary thread 來產生 MediaPlayer 的 instance,並撥放音樂。Music Player v2 設計圖如下:

musicplayer-v2-threading.png
圖一:Music Player v2 設計

針對 Music Player 個案,因為 MediaPlayer.create() 是以同步 (Synchronous) 方式準備 MediaPlayer,所以有出現 ANR 的機會。在早期 (2008 年) 的 MediaPlayer 設計中,因為 .create() 的實作上有點問題,遇到比較大的音樂檔時,.create() 花費的時間可能較久,形成一個 long operation。雖然後續版本已經改善這個問題,不過如果我們的資料來源不是檔案 (file) 的話,對 UI 就會有很不好的影響。

因此,採用 secondary thread 的方式來把 Music Player 設計的更好,避免可能產生的問題。這個範例衍生的議題是關於 association 的設計。假設我們想在「撥完音樂後」回報 MusicPlayerUI,我們可以讓 secondary thread 以 callback 方式回報 MusicPlayerUI,不過這不是一個好設計。

Music Player v2 的設計,MusicPlayerUI 成為一個 navigable object,意思是,實作上,我們可能會採取以下的實作(pseudo code):

Thread thr = new Thread(this);

因為不理想,所以暫時不進行程式碼實作。現在,我們已經將撥音樂的動作放到 secondary thread 裡了,接下來我們會想重構 association 的設計。

Android Leak 開發解密系列,整理自 Jollen 過去在 Android 領域的經驗,以「Do & Don't Do」形式分享一些重要但常被略的開發觀念。轉載請全文引用,並註明出處 (Jollen's Blog, http://www.jollen.org/blog),謝謝您對數位內容著作權的支持。

讀者留言 (0)

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。