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

Android 使用MediaPlayer以重叠方式多次播放同一文件,android,android-mediaplayer,Android,Android Mediaplayer,我的android应用程序当前发生了什么: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); ImageButton start = (ImageButton) findViewById(R.id.imageButton1); start.setOnClickLis

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

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对象设置一个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();
        }
    });
}
有什么问题:

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的状态使其自身重叠似乎是不可能的,但也许我错了


这会不会因为非法州而导致程序崩溃?如果不是,这会比我想要的慢吗?如果没有,有人能建议修复我的代码吗?

我建议您使用声音池而不是MediaPlayer。
教程是

根据您的要求,我认为声音池在这里更合适。MediaPlayer是一种非常重的、高延迟的对象,通常用于播放视频和长音乐曲目。SoundPool用于保存快速播放、重叠播放、低延迟的短片段。片段初始化一次,然后每次需要播放声音时都调用play。我认为唯一的限制是,未压缩的声音必须小于1MB,尽管我不能肯定。我接受了你的建议,最终切换到了SoundPool。绝对更容易,更容易管理,更快。虽然,在模拟器中,声音在短片段的末尾有点起伏。它可能只是模拟器。+1对我有用,糟糕的媒体播放器失败(通过跳过和剪切音频文件)声音池工作正常,但声音有问题。它产生的音量非常低。如何增加音量?