#MVCPlayerjava
我嘗試在android上使用MVC模式來開發一個音樂播放器。 GitHub地址:https://github.com/skyhacker2/MVCPlayerandroid
##什麼是MVC 來自維基百科git
那麼在android上,Activity就是Controller了。程序員
##劃分職責github
##設計咱們的播放器算法
###Models數據庫
爲何播放音樂不在Activity裏面作呢?數據庫設計
播放音樂是Model的一部分,而不是Activity的一部分。ide
我認爲模型表明what it is?this
因此播放器是一個model,我設計一個播放器類來封裝播放音樂的邏輯。
MusicPlayer.java
public class MusicPlayer { public interface PlayerListener { void onPlay(); void onPause(); void onResume(); void onPlayNext(); void onPlayPrev(); void onProgressUpdate(int progress); } private static MusicPlayer sMusicPlayer; private List<Music> mPlayList; // 播放列表 private boolean mPlaying; // 是否正在播放 private int mCurrentIndex; // 目前播放的位置 private int mCurrentProgress; // 播放進度 private MediaPlayer mMediaPlayer; // 播放器 private PlayerListener mListener; // 監聽器 private Timer mTimer; // 計時器 private int mTotalTime; // 播放時間 public static MusicPlayer getInstance(){...} public void play(final int index) {...} public void pause() {...} public void resume() {...} public void playNext() {...} public void playPrev() {...}
爲了當播放器內部狀態改變的時候通知Activity,我定義了一個PlayerListener
視圖就是xml文件,沒什麼好說的了。
##Activity
Activity裏面包含了視圖對象和播放器對象。
首先經過ContentResolver獲取手機裏面的歌曲, 而後放到播放器裏面,同時放到播放列表的adapter裏面。
mMusicPlayer = MusicPlayer.getInstance(); mMusicPlayer.setPlayList(getPlayList()); mMusicPlayer.setListener(getPlayerListener()); mMusicListAdapter = new MusicListAdapter(this, getPlayList()); mMusicListView.setAdapter(mMusicListAdapter);
當點擊列表時,告訴播放器播放音樂。
mMusicListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mMusicPlayer.play(position); } });
這時候播放器的狀態改變,onPlay
方法被調用,通知Activity更新視圖:
public MusicPlayer.PlayerListener getPlayerListener() { if (mPlayerListener == null) { mPlayerListener = new MusicPlayer.PlayerListener() { @Override public void onPlay() { updateUI(); } @Override public void onPause() { updateUI(); } @Override public void onResume() { updateUI(); } @Override public void onPlayNext() { updateUI(); } @Override public void onPlayPrev() { updateUI(); } @Override public void onProgressUpdate(int progress) { updateUI(); } }; } return mPlayerListener; }
整個過程是:View發出action,controller改變model,model通知controller狀態改變,controller更新view。
#小結
MVC模式使咱們更好地設計軟件,各部分的職責分工明確。Model和View相對獨立,易於更改。例如我不想在Activity裏面播放音樂,徹底能夠把MusicPlayer放到Service上去播放,並且播放代碼一句也不用改。