使用MediaPlayer以重叠方式多次播放同一文件

Mah*_*ans 7 android android-mediaplayer

我的Android应用程序当前发生了什么:

我将一个简单的图像映射到一个按钮,让它在点击时发出声音.在每次单击时,我在我的原始文件夹中创建一个带声音文件的MediaPlayer对象,我为该MediaPlayer对象设置一个OnClickListener,它停止播放该文件并将其释放,然后我播放MediaPlayer对象.

定义部分的代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
    ImageButton start = (ImageButton) findViewById(R.id.imageButton1);
    start.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            MediaPlayer play = MediaPlayer.create(MainActivity.this, R.raw.dvno);
            play.setOnCompletionListener(new OnCompletionListener() {
                public void onCompletion(MediaPlayer mp) {
                    mp.stop();
                    mp.release();
                    mp = null;
                }
            });
            play.start();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

它出什么问题了:

它工作正常并且不会崩溃,但它对于记忆来说很糟糕,而且一般来说非常慢.我希望用户能够连续多次点击按钮,尽可能快地听到声音播放,并一遍又一遍地重复听到声音播放.在每次单击时创建一个新的MediaPlayer对象并等待它完成并被释放会消耗太多资源,并且声音通常落后于实际按下按钮.我希望能够创建一个单独的声音作为MediaPlayer对象,可以在重叠时播放.

可能解决方案

在onCreate的范围内创建一个最终的MediaPlayer对象,而不是onClick,并以某种方式使用线程在每次单击时启动MediaPlayer对象.我读到这可能是一个可能的解决方案,但我以前从未使用过线程,我不知道它们是否比我当前的代码慢,如果不慢,所以我想知道是否有没有使用可能更简单的线程的解决方案.在这一点上操纵单个MediaPlayer的状态以使其自身重叠似乎是不可能的,但也许我错了.

由于非法国家会导致该程序崩溃吗?如果没有,这会比我想要的慢吗?如果没有,有人可以建议修复我的代码吗?

小智 6

我建议您使用SoundPool而不是MediaPlayer.教程就在这里