我是靠谱客的博主 默默早晨,最近开发中收集的这篇文章主要介绍将一个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);
    }
}

最后

以上就是默默早晨为你收集整理的将一个MediaPlayer控件分装思路单例模式将原有的接口对外开放。的全部内容,希望文章能够帮你解决将一个MediaPlayer控件分装思路单例模式将原有的接口对外开放。所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部