我有一个带有播放声音按钮的 Android 应用程序。播放声音的代码:
if (mp != null)
{
mp.release();
}
mp = MediaPlayer.create(this, R.raw.match);
mp.start();
mp是 Activity 中的一个字段:
public class Game extends Activity implements OnClickListener {
/** Called when the activity is first created. */
//variables:
MediaPlayer mp;
//...
应用程序运行正常,但在模拟器上单击按钮约 200 次后,应用程序崩溃并给我这个错误 https://dl.dropbox.com/u/5488790/error.txt (不知道如何将它发布在这里,这样它才会看起来像样)
我假设这是因为 MediaPlayer 对象消耗了太多内存,但 mp.release() 不应该处理这个问题吗?我在这里做错了什么?
最佳答案
如果您要将声音效果附加到按钮,MediaPlayer
通常对于此操作而言过于重量级。每次只是为了将声音数据加载到内存中,您都会遇到不必要的延迟。您应该考虑使用 SoundPool
。
无论哪种情况,都没有正当理由每次都释放并重新创建 MediaPlayer
。如果您决定使用 MediaPlayer
,请通过单击按钮来控制您拥有的单个实例。
MediaPlayer mp;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Other init code
//Create the player this way so it doesn't auto-prepare
mp = new MediaPlayer();
AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.match);
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
}
public void onDestroy() {
super.onDestroy();
//Release it only when no longer needed
mp.release();
mp = null;
}
public void onButtonClick(View v) {
if (mp.isPlaying()) {
mp.stop();
}
//Play the sound
mp.prepare();
mp.start();
}
希望对您有所帮助,但如果这种声音只是一个短暂的效果,我还是强烈建议您使用 SoundPool
。
关于Android MediaPlayer 崩溃的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12303460/