将一个MediaPlayer控件分装

将一个MediaPlayer控件分装

思路

1.只有一个对象,要使用单例模式
2.要考虑在多种条件下使用MediaPlayer的功能
3.通过构建内部接口,将原有的接口对外开放。
所有对MediaPlayer的操作都要通过封装好后的函数进行调用

单例模式

MediaPlayerHelp.java

private static MediaPlayerHelp instance;//null

public static MediaPlayerHelp getInstance(Context context){
    if (instance == null){
        synchronized (MediaPlayerHelp.class){
            if (instance ==null){
                instance = new MediaPlayerHelp(context);
            }
        }
    }
    return instance;
}

将原有的接口对外开放。

MediaPlayerHelp.java

private OnMediaPlayerHelpListener onMediaPlayerHelpListener;

public void setOnMediaPlayerHelpListener(OnMediaPlayerHelpListener onMediaPlayerHelpListener) {
    this.onMediaPlayerHelpListener = onMediaPlayerHelpListener;
}

public interface OnMediaPlayerHelpListener{
    void onPrepared(MediaPlayer mp);
}
 mMediaPlayer.prepareAsync();
//        捕获异步加载完成的通知,调用onPrepared()函数
        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
//                将异步加载完成的通知外放出去,由外面的具体对象来决定实现什么函数,需要再定义一个内部接口
                if (onMediaPlayerHelpListener != null){
                    onMediaPlayerHelpListener.onPrepared(mp);
                }
            }
        });

在调用该封装对象的类中

mMpHelp.setOnMediaPlayerHelpListener(new MediaPlayerHelp.OnMediaPlayerHelpListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mMpHelp.start();
    }
});

封装类的全部代码

package com.example.musicclouddemo.helps;

import android.content.Context;
import android.media.MediaPlayer;
import android.net.Uri;

import com.example.musicclouddemo.Utils.UserUtils;

import java.io.IOException;

/**
 * 将所有功能配件放在一个文件中,通过对象来进行调用。
 * 这种功能控件基本是一个单例模式
 *传入上下文是标配。
 * @ 功能
 * Ctreate by barry on 2020/10/14.
 */
public class MediaPlayerHelp {
    private static MediaPlayerHelp instance;//null

    public static MediaPlayerHelp getInstance(Context context){
        if (instance == null){
            synchronized (MediaPlayerHelp.class){
                if (instance ==null){
                    instance = new MediaPlayerHelp(context);
                }
            }
        }
        return instance;
    }
    private MediaPlayer mMediaPlayer;//null
    private Context mContext;
    private OnMediaPlayerHelpListener onMediaPlayerHelpListener;
    private String mPath;//null

    public void setOnMediaPlayerHelpListener(OnMediaPlayerHelpListener onMediaPlayerHelpListener) {
        this.onMediaPlayerHelpListener = onMediaPlayerHelpListener;
    }

    /**
     * 由于MediaPlayerHelp是单例,单例对象的字段也基本是单例。
     * 上下文
     * 初始化mediaPlayer;
     * @param context
     */
    private MediaPlayerHelp(Context context) {
        mContext = context;
        mMediaPlayer = new MediaPlayer();
//        MediaPlayer.create()----播放固定音乐使用。
    }
    /**
     * 网络音乐需要设置uri;setPath
     * 2.start;
     * 3.release
     */
    /**
     * 网络音乐需要设置uri
     * @param path
     */
    public void setPath(String path){
        /**
         * 1.音乐正在播放,重置音乐播放状态
         * 2.设置播放音乐路劲
         * 3.准备--播放
         */
        mPath = path;
        if(mMediaPlayer.isPlaying()){
            mMediaPlayer.reset();
        }
//        设置播放路径
        try {
            mMediaPlayer.setDataSource(mContext, Uri.parse(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
//        异步准备
        mMediaPlayer.prepareAsync();
//        捕获异步加载完成的通知,调用onPrepared()函数
        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
//                将异步加载完成的通知外放出去,由外面的具体对象来决定实现什么函数,需要再定义一个内部接口
                if (onMediaPlayerHelpListener != null){
                    onMediaPlayerHelpListener.onPrepared(mp);
                }
            }
        });
    }

    /**
     * 返回正在播放的音乐路径
     * @return
     */
    public String getPath(){
        return mPath;
    }
    public void start(){
        if (mMediaPlayer.isPlaying()){
//            正在播放不做任何处理
            return;
        }
//        从头开始播放。
        mMediaPlayer.start();
    }
    public void pause(){
        mMediaPlayer.pause();
    }
    public interface OnMediaPlayerHelpListener{
        void onPrepared(MediaPlayer mp);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值