#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上去播放,并且播放代码一句也不用改。