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

时间:2012-10-21 19:26:14

标签: 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();
        }
    });
}

它出了什么问题:

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

可能的解决方案:

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

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

1 个答案:

答案 0 :(得分:6)

我建议您使用SoundPool代替MediaPlayer。 教程是here