我的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 的状态以使其自身重叠似乎是不可能的,但也许我错了。
这会因为非法状态而使程序崩溃吗?如果没有,这会比我想要的慢吗?如果没有,任何人都可以建议修复我的代码吗?