8

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

这会因为非法状态而使程序崩溃吗?如果没有,这会比我想要的慢吗?如果没有,任何人都可以建议修复我的代码吗?

4

1 回答 1

6

我建议您为此使用 SoundPool 而不是 MediaPlayer。教程在这里

于 2012-10-21T19:39:11.650 回答