Android MediaPlayer 崩溃的应用程序

标签 android

我有一个带有播放声音按钮的 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/

相关文章:

android - ConstraintLayout 中的组阻止设置 ProgressBar 可见性

android - 是否可以在运行时更改 Android 中的布局宽度和高度?

java - 如何从 Android 设备(如 Google Pay 应用)获取用户名和电子邮件地址

android - 如何在运行每个测试用例时卸载并重新安装应用程序

android - 如何仅使用 CLI 在 Linux 上安装 Android SDK?

Android FragmentTransaction 自定义动画 (Unknown Animator Name : Translate)

Android ListView 被可绘制对象替换或显示不正确的背景

android - “在旧版本上调用新方法”lint 检查未发现高于 Android Studio 中的最小 api 调用

java - Android 中使用 PhoneGap 的异步任务

android - 数据绑定(bind)中通过变量标签设置的文本大小