在Android上使用MVC模式來開發一個音樂播放器:MVCPlayer

dgy7 9年前發布 | 22K 次閱讀 MVCPlayer Android開發 移動開發

MVCPlayer

我嘗試在android上使用MVC模式來開發一個音樂播放器。

什么是MVC

來自維基百科

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

那么在android上,Activity就是Controller了。

劃分職責

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

設計我們的播放器

Models

  1. Music - 代表一首歌曲,有歌名、路徑、歌手等信息
  2. 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上去播放,而且播放代碼一句也不用改。

在Android上使用MVC模式來開發一個音樂播放器:MVCPlayer

項目主頁:http://www.baiduhome.net/lib/view/home/1432209236974

 本文由用戶 dgy7 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!