在Android上使用MVC模式來開發一個音樂播放器:MVCPlayer
MVCPlayer
我嘗試在android上使用MVC模式來開發一個音樂播放器。
什么是MVC
- 控制器 Controller - 負責轉發請求,對請求進行處理。
- 視圖 View - 界面設計人員進行圖形界面設計。
- 模型 Model - 程序員編寫程序應有的功能(實現算法等等)、數據庫專家進行數據管理和數據庫設計(可以實現具體的功能)。
那么在android上,Activity就是Controller了。
劃分職責
- activity負責處理view的事件和獲取模型數據并刷新視圖。
- view只負責顯示
- model就是數據部分,不能更新view,數據改變必須通過activity更新view。
設計我們的播放器
Models
- Music - 代表一首歌曲,有歌名、路徑、歌手等信息
- MusicPlayer - 播放器,我們的邏輯處理部分。
為什么播放音樂不在Activity里面做呢?
播放音樂是Model的一部分,而不是Activity的一部分。
我認為模型代表what it is?
所以播放器是一個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
Views
視圖就是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上去播放,而且播放代碼一句也不用改。
本文由用戶 dgy7 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!