Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MediaPlayer或SoundPool支持多个短声音?_Java_Android_Android Mediaplayer_Soundpool - Fatal编程技术网

Java MediaPlayer或SoundPool支持多个短声音?

Java MediaPlayer或SoundPool支持多个短声音?,java,android,android-mediaplayer,soundpool,Java,Android,Android Mediaplayer,Soundpool,该应用程序基本上允许用户在单击各种项目时播放动物声音、声音或其他声音。我正在试图弄清楚我是否以正确的方式执行此操作,因为当用户静音>取消静音>播放声音时,我看到了类似此错误的一些问题: java.lang.IllegalStateException位于 android.media.MediaPlayer.isplay(本机方法) 以下是我如何使用MediaPlayer的示例: if(audio_all) { if(mMediaPlayer != null) {

该应用程序基本上允许用户在单击各种项目时播放动物声音、声音或其他声音。我正在试图弄清楚我是否以正确的方式执行此操作,因为当用户静音>取消静音>播放声音时,我看到了类似此错误的一些问题:

java.lang.IllegalStateException位于
android.media.MediaPlayer.isplay(本机方法)

以下是我如何使用MediaPlayer的示例:

    if(audio_all) {
        if(mMediaPlayer != null) {
            if(mMediaPlayer.isPlaying()) {
                mMediaPlayer.stop();
                mMediaPlayer.release();                
            }
        }

        mMediaPlayer = MediaPlayer.create(this, R.raw.whatever);
        mMediaPlayer.start();
        mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            public void onCompletion(MediaPlayer mediaPlayer) {
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
        });
    }
我为不同的按钮等多次这样做,确保在完成后释放(),因为我以前遇到过mem问题。因此,上面的异常告诉我,
isplay()
无效,因为
MediaPlayer
不存在,但由于某种原因,如果(mMediaPlayer!=null),它会忽略

这是必要的停止,如果有任何东西正在播放,因为用户可以随意点击,当然我不希望任何声音重叠

以下是用户静音的方式:

case R.id.action_toggle_sounds:
            if(audio_all) {

                if(mMediaPlayer != null) {
                   if(mMediaPlayer.isPlaying()) {
                   mMediaPlayer.stop();
                   mMediaPlayer.release();                
                   }
                }

                Toast.makeText(this,"All sounds disabled",Toast.LENGTH_LONG).show();
                audio_all = false;
            } else {
                Toast.makeText(this,"All sounds enabled",Toast.LENGTH_LONG).show();
                audio_all = true;
            }
            return true;

我非常感谢您的帮助,非常感谢

如果没有太多曲目可播放(不超过32首),则可以尝试初始化多个
MediaPlayer
实例,并仅在调用app onPause()/onStop()时释放它们。 然后您将拥有一个随时可用的
MediaPlayer的
池。你只需要记住哪一个正在使用

另外,如果您在多个线程(不仅仅是UI线程)中使用MediaPlayer,则必须使用互斥(线程阻塞)来避免问题

基于MediaPlayer的状态机-IllegalStateException基本上意味着调用
isplay()
不允许时播放器实例处于状态。对于
isplay()

case R.id.action_toggle_sounds:
            if(audio_all) {

                if(mMediaPlayer != null) {
                   if(mMediaPlayer.isPlaying()) {
                   mMediaPlayer.stop();
                   mMediaPlayer.release();                
                   }
                }

                Toast.makeText(this,"All sounds disabled",Toast.LENGTH_LONG).show();
                audio_all = false;
            } else {
                Toast.makeText(this,"All sounds enabled",Toast.LENGTH_LONG).show();
                audio_all = true;
            }
            return true;