根據先前所討論過的觀念,我們把 "play" music 的功能設計在 secondary thread 裡。Android SDK 使用 java.lang.Thread 來建立 thread,使用 secondary thread 來產生 MediaPlayer 的 instance,並撥放音樂。Music Player v2 設計圖如下:
圖一: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),謝謝您對數位內容著作權的支持。
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw