文档章节

Android MVC实现一个音乐播放器

Nov_Eleven
 Nov_Eleven
发布于 2015/05/16 00:33
字数 725
阅读 752
收藏 28

#MVCPlayer

我尝试在android上使用MVC模式来开发一个音乐播放器。 GitHub地址:https://github.com/skyhacker2/MVCPlayer

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

image

© 著作权归作者所有

Nov_Eleven
粉丝 13
博文 79
码字总数 18490
作品 0
江门
程序员
私信 提问
android如何实现文件打开方式可供选择功能。

本人做了一款android音乐播放器,要实现一项功能如何在进入文件管理时候,选择音乐文件,弹出可供选择的播放器中有本人做的音乐播放器这一项。 我看多米音乐,华为音乐软件安装之后,在andro...

simpower
2014/10/04
0
0
Android 解读开源项目UniversalMusicPlayer(播放控制层)

版权声明:本文为博主原创文章,未经博主允许不得转载 源码:AnliaLee/android-UniversalMusicPlayer 首发地址:Anlia_掘金 大家要是看到有错误的地方或者有啥好的建议,欢迎留言评论 前言 ...

Anlia
2018/04/29
0
0
Android SDK Document 框架导读的翻译和注解[3]

《Android SDK Document 框架导读的翻译和注解》系列的文章将对Android应用程序的架构做一个基本的介绍,本文源于Android SDK ducument的第一个部分,描绘了Android 应用程序系统的骨架,因此...

晨曦之光
2012/03/07
166
0
Android SDK Document 框架导读的翻译和注解[3]

《Android SDK Document 框架导读的翻译和注解》系列的文章将对Android应用程序的架构做一个基本的介绍,本文源于Android SDK ducument的第一个部分,描绘了Android 应用程序系统的骨架,因此...

晨曦之光
2012/03/09
51
0
手把手教你做音乐播放器(一)功能规划

版权声明:本文为博主原创文章,禁止转载,违者必究。 https://blog.csdn.net/anddlecn/article/details/52594998 前言 学习完“计算器” “视频播放器” “蓝牙聊天”以后,对安卓应用的开发...

anddlecn
2016/09/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Redox OS 发布 0.5 版

Redox OS 是一个几乎完全以 Rust 语言编写的通用操作系统及周围生态(例如文件系统、显示服务器及 Rust 版本的 libc)。其遵循微内核架构,在一定程度上兼容于 POSIX。 该项目于日前发布了 ...

linuxCool
31分钟前
0
0
更新上传git/gitee项目时出现密码配置错误(incorrect username or password)的解决办法

1.输入【git remote add origin git地址】 命令时出现incorrect username or password的错误,这是因为之前弹出输入账户和密码时输错了,而且会一直默认错误的账户和密码,因此需要把之前输入...

west_coast
38分钟前
0
0
Jenkins基础入门-1-Jenkins简单介绍和环境安装

如果在做自动化测试的朋友,应该熟悉Jenkins,或者至少使用过。如果一个人没有使用过Jenkins或者hudson,hudson是Jenkins的前身,他还说自己做过自动化测试,只能说,他只不过是在做半自动化...

shzwork
38分钟前
0
0
linux上解压版安装jdk,tomcat

需要的安装包 1.vmware12 2.centos7版本 3.安装完成后需要xshell来连接远程虚拟机,虚拟机保证要联网,网络畅通。 4.xftp用来向linux传输文件用,一般来说xshell和xftp配套使用 5.对应的压缩...

architect刘源源
今天
26
0
使用 spring 的 IOC 解决程序耦合

工厂模式解耦 在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时...

骚年锦时
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部