Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.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 在播放完媒体播放器后,如何释放它?_Java_Android_Release_Android Mediaplayer - Fatal编程技术网

Java 在播放完媒体播放器后,如何释放它?

Java 在播放完媒体播放器后,如何释放它?,java,android,release,android-mediaplayer,Java,Android,Release,Android Mediaplayer,我正在制作一个音效板,点击大约30种不同的声音后,它停止工作;我相信android的内存已经用完了。下面是我的代码。如何实现.release(),以便在播放完声音后释放它?我真的不在乎两件事是否同时发生;为了实现这一点,卡子太短。我只想得到我的代码集 public class soundPageOne extends Activity { public void onCreate(Bundle savedState) { super.onCreate(savedState

我正在制作一个音效板,点击大约30种不同的声音后,它停止工作;我相信android的内存已经用完了。下面是我的代码。如何实现.release(),以便在播放完声音后释放它?我真的不在乎两件事是否同时发生;为了实现这一点,卡子太短。我只想得到我的代码集

public class soundPageOne extends Activity {
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        setContentView(R.layout.soundsone);

        final MediaPlayer pg1 = MediaPlayer.create(this, R.raw.peter1);
        Button playSound1 = (Button) this.findViewById(R.id.peter1Button);

        playSound1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                pg1.start();

        }
    });

我已经做了很多搜索,但是由于我缺乏java/android知识,我一直无法找到任何工作。提前谢谢,如果有人还需要代码,请告诉我

创建一个类,比如使用
SoundPool
变量创建
AudioPlayer
。设置构造函数以初始化
AudioPlayer
对象并创建
Play
方法。SoundPool对于多次播放的短音效果更好,并且不需要您发布

public class AudioPlayer {

    private SoundPool sPool = new SoundPool(Integer.MAX_VALUE, AudioManager.STREAM_MUSIC, 0);

    public AudioPlayer(Context c, int id){  
        sounds.put("1",sPool.load(c, id, 1));   
    }

    public void play(Context c) {
        sPool.play("1", 1, 1, 1, 0, 1f);
    }
}
所以你的班级应该是这样的

public class soundPageOne extends Activity {
public void onCreate(Bundle savedState) {
    super.onCreate(savedState);
    setContentView(R.layout.soundsone);

    final AudioPlayer ap = new AudioPlayer(this, R.raw.sound);
    Button playSound1 = (Button) this.findViewById(R.id.peter1Button);

    playSound1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ap.play();

    }
});

使用
SoundPool
变量创建一个类,比如说
AudioPlayer
。设置构造函数以初始化
AudioPlayer
对象并创建
Play
方法。SoundPool对于多次播放的短音效果更好,并且不需要您发布

public class AudioPlayer {

    private SoundPool sPool = new SoundPool(Integer.MAX_VALUE, AudioManager.STREAM_MUSIC, 0);

    public AudioPlayer(Context c, int id){  
        sounds.put("1",sPool.load(c, id, 1));   
    }

    public void play(Context c) {
        sPool.play("1", 1, 1, 1, 0, 1f);
    }
}
所以你的班级应该是这样的

public class soundPageOne extends Activity {
public void onCreate(Bundle savedState) {
    super.onCreate(savedState);
    setContentView(R.layout.soundsone);

    final AudioPlayer ap = new AudioPlayer(this, R.raw.sound);
    Button playSound1 = (Button) this.findViewById(R.id.peter1Button);

    playSound1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ap.play();

    }
});
你能用一把吗

比如:

public class soundPageOne extends Activity implements MediaPlayer.OnCompletionListener {
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        setContentView(R.layout.soundsone);
        final MediaPlayer pg1 = MediaPlayer.create(this, R.raw.peter1);

        //***set the listener here***
        pg1.setOnCompletionListener(this);

        Button playSound1 = (Button) this.findViewById(R.id.peter1Button);

        playSound1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pg1.start();
            }   
        });
    }

    //***this code will be executed once the sound finishes playing***
    @Override
    public void onCompletion(MediaPlayer mp) {
        //log messages, other things can go here
        mp.release();
    }
你能用一把吗

比如:

public class soundPageOne extends Activity implements MediaPlayer.OnCompletionListener {
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        setContentView(R.layout.soundsone);
        final MediaPlayer pg1 = MediaPlayer.create(this, R.raw.peter1);

        //***set the listener here***
        pg1.setOnCompletionListener(this);

        Button playSound1 = (Button) this.findViewById(R.id.peter1Button);

        playSound1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                pg1.start();
            }   
        });
    }

    //***this code will be executed once the sound finishes playing***
    @Override
    public void onCompletion(MediaPlayer mp) {
        //log messages, other things can go here
        mp.release();
    }

试试这样的

你的活动课:

public class soundPageOne extends Activity {
public void onCreate(Bundle savedState) {
    super.onCreate(savedState);
    setContentView(R.layout.soundsone);

    final AudioPlayer pg1 = new AudioPlayer();
    Button playSound1 = (Button) this.findViewById(R.id.peter1Button);

    playSound1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            pg1.play(this, R.raw.sound);

    }
});
}

这是另一个Java类:

public class AudioPlayer {

private MediaPlayer mPlayer;

public void stop() {
    if (mPlayer != null) {
        mPlayer.release();
        mPlayer = null;
    }
}

public void play(Context c, int sound) {

    stop();

    mPlayer = MediaPlayer.create(c, sound);

    mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        public void onCompletion(MediaPlayer mp) {
            stop();
        }
    });

    mPlayer.start();
}

public boolean isPlaying() {
    return mPlayer != null;
}

}

试试这样的方法

你的活动课:

public class soundPageOne extends Activity {
public void onCreate(Bundle savedState) {
    super.onCreate(savedState);
    setContentView(R.layout.soundsone);

    final AudioPlayer pg1 = new AudioPlayer();
    Button playSound1 = (Button) this.findViewById(R.id.peter1Button);

    playSound1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            pg1.play(this, R.raw.sound);

    }
});
}

这是另一个Java类:

public class AudioPlayer {

private MediaPlayer mPlayer;

public void stop() {
    if (mPlayer != null) {
        mPlayer.release();
        mPlayer = null;
    }
}

public void play(Context c, int sound) {

    stop();

    mPlayer = MediaPlayer.create(c, sound);

    mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        public void onCompletion(MediaPlayer mp) {
            stop();
        }
    });

    mPlayer.start();
}

public boolean isPlaying() {
    return mPlayer != null;
}

}

我留下了一条评论,但我会发布一个答案来说明我的意思

这样做的目的是,您可以使用一定数量的
MediaPlayer
实例。这样,您就永远不会超过实例的最大数量。数组应该是您期望能够听到的并发声音数的长度。如果声音是本地文件,则准备声音所需的时间几乎可以忽略不计,因此在单击处理程序中调用
create
,不会导致糟糕的性能。我想,您的每个按钮都与特定的资源相关联,因此我设置了一个助手方法,以相同的方式为每个按钮创建和播放声音

public class soundPageOne extends Activity {

    private MediaPlayer[] mPlayers = new MediaPlayer[2];
    private int mNextPlayer = 0;

    @Override
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        setContentView(R.layout.soundsone);
        Button playSound1 = (Button)this.findViewById(R.id.peter1Button);
        playSound1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startSound(R.raw.peter1);
            }
        });
    }

    public void onDestroy() {
        super.onDestroy(); // <---------------------- This needed to be there
        for (int i = 0; i < mPlayers.length; ++i)
            if (mPlayers[i] != null)
                try {
                    mPlayers[i].release();
                    mPlayers[i] = null;
                }
                catch (Exception ex) {
                    // handle...
                }
    }

    private void startSound(int id) {
        try {
            if (mPlayers[mNextPlayer] != null) {
                mPlayers[mNextPlayer].release();
                mPlayers[mNextPlayer] = null;
            }
            mPlayers[mNextPlayer] = MediaPlayer.create(this, id);
            mPlayers[mNextPlayer].start();
        }
        catch (Exception ex) {
            // handle
        }
        finally {
            ++mNextPlayer;
            mNextPlayer %= mPlayers.length;
        }
    }

}
公共类soundPageOne扩展活动{
私有媒体播放器[]mPlayers=新媒体播放器[2];
私有int mNextPlayer=0;
@凌驾
创建公共void(Bundle savedState){
super.onCreate(savedState);
setContentView(R.layout.soundsone);
按钮播放声音1=(按钮)this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
startSound(R.raw.peter1);
}
});
}
公共空间{

super.ondestory();//我留下了一条评论,但我会发布一个答案来说明我的意思

我们的想法是,您可以使用一定数量的
MediaPlayer
实例。这样,您就不会超过最大实例数。数组的长度应该是您希望能够听到的并发声音数的长度。如果声音是本地文件,则准备声音所需的时间长度应该是almo可以忽略不计,因此在单击处理程序中调用
create
不会导致糟糕的性能。我想,您的每个按钮都与特定的资源关联,因此我设置了一个助手方法,以相同的方式为每个按钮创建和播放声音

public class soundPageOne extends Activity {

    private MediaPlayer[] mPlayers = new MediaPlayer[2];
    private int mNextPlayer = 0;

    @Override
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        setContentView(R.layout.soundsone);
        Button playSound1 = (Button)this.findViewById(R.id.peter1Button);
        playSound1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startSound(R.raw.peter1);
            }
        });
    }

    public void onDestroy() {
        super.onDestroy(); // <---------------------- This needed to be there
        for (int i = 0; i < mPlayers.length; ++i)
            if (mPlayers[i] != null)
                try {
                    mPlayers[i].release();
                    mPlayers[i] = null;
                }
                catch (Exception ex) {
                    // handle...
                }
    }

    private void startSound(int id) {
        try {
            if (mPlayers[mNextPlayer] != null) {
                mPlayers[mNextPlayer].release();
                mPlayers[mNextPlayer] = null;
            }
            mPlayers[mNextPlayer] = MediaPlayer.create(this, id);
            mPlayers[mNextPlayer].start();
        }
        catch (Exception ex) {
            // handle
        }
        finally {
            ++mNextPlayer;
            mNextPlayer %= mPlayers.length;
        }
    }

}
公共类soundPageOne扩展活动{
私有媒体播放器[]mPlayers=新媒体播放器[2];
私有int mNextPlayer=0;
@凌驾
创建公共void(Bundle savedState){
super.onCreate(savedState);
setContentView(R.layout.soundsone);
按钮播放声音1=(按钮)this.findViewById(R.id.peter1Button);
playSound1.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
startSound(R.raw.peter1);
}
});
}
公共空间{

super.onDestroy();//我不确定;我非常缺乏经验。我应该在我的代码中放在哪里?媒体播放器完成后,“…”是什么意思?…是什么意思(可能是日志消息?).我将编辑我的答案,使代码更充实一些…我想这就是它的目的。我真的不想做任何其他事情(至少我不想做)。我只是厌倦了用媒体播放器重载我的应用程序,我需要一种方法来结束它们。但是,是的,我只是不知道在我的代码中放在哪里,或者在代码中更改什么,或者是否有必要对所有按钮重复。很抱歉我的无知,感谢所有的帮助@psyren89OK,这样就可以了,但是一旦我尝试再次播放按钮,它就会崩溃soundPageOne类。我试图在发布后重置,但没有效果。有什么想法吗?@psyren89将您的媒体播放器创建代码(最终的媒体播放器pg1…和pg1.setOnCompletion…)移动到onClick()方法中。我不确定;我非常缺乏经验。我应该在代码中尝试将其放在哪里?以及“…”是什么for?…是指媒体播放器播放完毕后,您想执行的任何其他代码(可能是日志消息?)。我将编辑我的答案以充实代码……我想这就是它的目的。我真的不想做任何其他事情(至少我不想做)。我只是厌倦了用媒体播放器重载我的应用程序,我需要一种方法来结束它们。但是,是的,我只是不知道在我的代码中放在哪里,或者在代码中更改什么,或者是否有必要对所有按钮重复。很抱歉我的无知,感谢所有的帮助@psyren89OK,这样就可以了,但是一旦我尝试再次播放按钮,它就会崩溃soundPageOne类。我试图在释放后重置,但