如何正确使用mediaPlayer?

How to use mediaPlayer correctlty?

我正在尝试在我的应用程序中播放音乐,当媒体播放器正在加载时我想让用户继续使用该应用程序,但每次我开始加载媒体时该应用程序都会卡住几秒钟播放器,当媒体播放器完成加载后,应用程序 returns 才正常并再次开始工作,有时它不仅冻结,它还会显示 OS 的弹出菜单,提示用户退出应用程序。

我在 Google 或 YouTube 上找不到任何解决方案,有人知道我的代码有什么问题吗?

final Handler handler = new Handler();
Runnable runnable = new Runnable() {
    @Override
    public void run() {
            try {
                    String STREAM_URL = #####;  // here i put the URL of the song
                    mediaPlayer = new MediaPlayer();
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

                    try {
                        mediaPlayer.setDataSource(STREAM_URL);
                        mediaPlayer.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            } catch (NullPointerException e) {
                Log.d(TAG, "run: NullPointerException = " + e.getMessage());
                FirebaseCrash.log("Tag = " + TAG + "run: NullPointerException = " + e.getMessage());
            }
        }
    }
};
handler.post(runnable);

即使您正在创建 HandlerMediaPlayer 的创建仍然发生在主 UI 线程上。您应该调用 prepareAsync 或使用 AsyncTask 或其他一些方法来避免在主线程上调用 prepare

来自documentation for Handler:

When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it

如果您正在从网络流式传输音乐,准备播放媒体尤其需要一段时间。一种选择可能是调用 prepareAsync 而不是调用 prepare。在这种情况下,您应该设置 OnPreparedListener,并在该回调调用中设置 start.