Android MVC實現一個音樂播放器

#MVCPlayerjava

我嘗試在android上使用MVC模式來開發一個音樂播放器。 GitHub地址:https://github.com/skyhacker2/MVCPlayerandroid

##什麼是MVC 來自維基百科git

  1. 控制器 Controller - 負責轉發請求,對請求進行處理。
  2. 視圖 View - 界面設計人員進行圖形界面設計。
  3. 模型 Model - 程序員編寫程序應有的功能(實現算法等等)、數據庫專家進行數據管理和數據庫設計(能夠實現具體的功能)。

那麼在android上,Activity就是Controller了。程序員

##劃分職責github

  1. activity負責處理view的事件和獲取模型數據並刷新視圖。
  2. view只負責顯示
  3. model就是數據部分,不能更新view,數據改變必須經過activity更新view。

##設計咱們的播放器算法

###Models數據庫

  1. Music - 表明一首歌曲,有歌名、路徑、歌手等信息
  2. MusicPlayer - 播放器,咱們的邏輯處理部分。

爲何播放音樂不在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

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

image

相關文章
相關標籤/搜索