尝试释放和停止 MediaPlayer 时 Android ANR

问题描述 投票:0回答:1

我有以下方法,只需从 URL 请求 .mp3 文件,加载 MediaPlayer 并根据 URL 是否加载来显示或隐藏播放按钮:

public class PlayMusicFragment extends Fragment  {

 private MediaPlayer mediaPlayer;

    private void initializeMusicButton(String url) {
        
        if (Objects.isNull(mediaPlayer)) {
            mediaPlayer = GenericUtils.loadMediaPlayer(url, new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    binding.playMusicButton.setVisibility(VISIBILE);
                }
            }, new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
                    binding.playMusicButton.setVisibility(GONE);
                    return false;
                }
            });
        }
    
        binding.playButton.setOnClickListener(view -> {
            if (Objects.nonNull(mediaPlayer)) {
                mediaPlayer.start();
            }
        });
    
    }

}

在此片段中,我还重写了

onStop
方法以释放 MediaPlayer:

@Override
public void onStop() {
    super.onStop();
    if (Objects.nonNull(mediaPlayer)) {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
        }
        mediaPlayer.release();
        mediaPlayer = null;
    }
}

loadMediaPlayer
方法执行以下操作:

   public static MediaPlayer loadMediaPlayer(String soundURL, MediaPlayer.OnPreparedListener onPreparedListener, MediaPlayer.OnErrorListener onErrorListener) {
        MediaPlayer mediaPlayer = null;
        try {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setAudioAttributes(new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .build());
            mediaPlayer.setOnPreparedListener(onPreparedListener);
            mediaPlayer.setOnErrorListener(onErrorListener);
            mediaPlayer.setDataSource(soundURL);
            mediaPlayer.setLooping(false);
            mediaPlayer.prepareAsync();
        } catch (Exception ex) {
            if (Objects.nonNull(mediaPlayer)) {
                mediaPlayer.release();
            }
        }
        return mediaPlayer;
    }

问题是 PlayStore Crashlytics 报告警告我,覆盖的

onStop
方法代码会生成 ANR:

我不明白为什么会发生这种情况,我用自己的手机和模拟器测试过,没有发现任何 ANR。

有什么提示吗?

android android-mediaplayer media-player android-anr-dialog anr
1个回答
0
投票

不应将 null 分配给已释放的对象。把它留给垃圾收集器吧。

© www.soinside.com 2019 - 2024. All rights reserved.