首页 > 解决方案 > 关于我的音板 android 应用程序的内存问题的问题 (E/MediaPlayerNative: error (1, -19))

问题描述

我有播放声音的按钮,它们都可以单独工作,使用 14 次以上后,如果我不重新启动应用程序,它们将不再工作

每次使用后已经尝试过mediaplayer.realease,不起作用,认为是内存问题不知道如何处理

MediaPlayer SonDeadliest
protected void onCreate(Bundle savedInstanceState)
    {
       boutonDeadliest.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                SonDeadliest = MediaPlayer.create(getApplicationContext(),R.raw.themostdeadliestganginuganda);
                SonDeadliest.start();
                fin(SonDeadliest);
            }
        });
 public void fin(MediaPlayer m)
 {
    if(m.isPlaying())
    {

    }
    else 
    {
        m.stop();
        m.release();
    }
}

我有 24 个按钮,我正在尝试获得一个可以运行所有功能的应用程序,而无需重新启动应用程序谢谢 :)

标签: javaandroid

解决方案


问题在于以这种方式反复使用 MediaPlayer 可能会产生误导:

SonDeadliest = MediaPlayer.create(getApplicationContext(),R.raw.themostdeadliestganginuganda); SonDeadliest.start();

它会消耗不必要的资源。为了更好地理解,我建议您阅读这篇文章。它是使用 Kotlin 编写的,但通过一点 kotlin 学习你就可以理解。

这是Java中的一个实现,尝试使用您的场景:

MediaPlayer myMediaPlayer;
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        //Media Player setup
        myMediaPlayer = new MediaPlayer();
        myMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });
        myMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.reset();
            }
        });

        //Buttons
        Button button1 = view.findViewById(R.id.button_record1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                playSound(R.raw.record1);
            }
        });
        Button button2 = view.findViewById(R.id.button_record2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                playSound(R.raw.record2);
            }
        });
    }

    void playSound(int rawResId) {
        try {
            AssetFileDescriptor afd = getContext().getResources().openRawResourceFd(rawResId);
            if (afd != null) {
                myMediaPlayer.reset();
                myMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                myMediaPlayer.prepareAsync();
            }
        } catch (Exception ex) {
            Log.d("MediaPLayer", "playSound exception: " + ex.getMessage());
        }
    }

代码可以改进,但我的目的只是为了便于理解。为了简化,我只使用了 2 个按钮。但我建议您考虑使用更好的解决方案,而不是为 24 个按钮中的每一个都创建一个侦听器。(查看 DataBinding,将资源作为参考传递)。


推荐阅读