Java 如何正确使用mediaPlayer?
我正在尝试在我的应用程序中播放音乐,当媒体播放器加载时,我希望允许用户继续使用该应用程序,但每次我开始加载媒体播放器时,该应用程序都会被卡住几秒钟,当媒体播放器加载完后,该应用程序才会恢复正常并重新开始工作,有时它不仅仅是冻结,它还显示操作系统的弹出菜单,提示用户退出应用程序 我在谷歌或YouTube上找不到任何解决方案,有人知道我的代码出了什么问题吗Java 如何正确使用mediaPlayer?,java,android,android-mediaplayer,media,Java,Android,Android Mediaplayer,Media,我正在尝试在我的应用程序中播放音乐,当媒体播放器加载时,我希望允许用户继续使用该应用程序,但每次我开始加载媒体播放器时,该应用程序都会被卡住几秒钟,当媒体播放器加载完后,该应用程序才会恢复正常并重新开始工作,有时它不仅仅是冻结,它还显示操作系统的弹出菜单,提示用户退出应用程序 我在谷歌或YouTube上找不到任何解决方案,有人知道我的代码出了什么问题吗 final Handler handler = new Handler(); Runnable runnable = new Runnable(
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);
即使您正在创建一个
处理程序
,MediaPlayer
的创建仍然在主UI线程上进行。您应该调用prepareAsync
或使用AsyncTask
或其他方法来避免在主线程上调用prepare
从:
创建新处理程序时,它将绑定到线程/消息
正在创建它的线程的队列
如果您是从网络流媒体播放音乐,准备播放媒体尤其需要一段时间。一个选项可能是调用
prepareAsync
,而不是调用prepare
。在这种情况下,您应该设置,并且在该回调调用中,即使您正在创建处理程序
,也会在主UI线程上创建MediaPlayer
。您应该调用prepareAsync
或使用AsyncTask
或其他方法来避免在主线程上调用prepare
从:
创建新处理程序时,它将绑定到线程/消息
正在创建它的线程的队列
如果您是从网络流媒体播放音乐,准备播放媒体尤其需要一段时间。一个选项可能是调用
prepareAsync
,而不是调用prepare
。在这种情况下,您应该设置,并且在该回调调用中start
共享日志请共享日志我尝试将prepare更改为prepareAsync,并添加prepareListener并启动媒体,然后将其删除,应用程序不再卡住,但音乐也不会播放。。那么你是说我现在没有创建处理程序也是可能的?创建处理程序的正确方法是什么?我认为您根本不需要处理程序。我并不是说你没有正确地创造它。我只是觉得它没有达到你期望的效果。通过创建处理程序
并向其发布可运行
,您正在同一线程上运行该代码,就在稍后该线程的事件循环处理您发布的事件时。只要MediaPlayer
未播放,请在OnPreparedListener
中输出一些日志,以确保正在调用它,并确保日志中没有警告或错误。问题中的代码没有调用start
,因此我不完全确定您以前是如何使用它的。我刚刚解决了问题,非常感谢Dave,您真的很有帮助。从开发应用程序的第一天起,我就遇到了这个问题,最终解决了这个问题。。。我的错误是将媒体控件(所有视图按钮等)更改到PrepareListener之外,而只将mediaPlayer.start()放入;在这个侦听器中,应用程序一直被卡住的原因可能是视图等待媒体加载,然后才更新到正确的信息。。。真的,男人,TNX很多:)很高兴能帮上忙。我试着把prepare改成prepareAsync,添加prepareListener,然后启动媒体。在它旁边,应用程序不再卡住,但音乐也不会播放。。那么你是说我现在没有创建处理程序也是可能的?创建处理程序的正确方法是什么?我认为您根本不需要处理程序。我并不是说你没有正确地创造它。我只是觉得它没有达到你期望的效果。通过创建处理程序
并向其发布可运行
,您正在同一线程上运行该代码,就在稍后该线程的事件循环处理您发布的事件时。只要MediaPlayer
未播放,请在OnPreparedListener
中输出一些日志,以确保正在调用它,并确保日志中没有警告或错误。问题中的代码没有调用start
,因此我不完全确定您以前是如何使用它的。我刚刚解决了问题,非常感谢Dave,您真的很有帮助。从开发应用程序的第一天起,我就遇到了这个问题,最终解决了这个问题。。。我的错误是将媒体控件(所有视图按钮等)更改到PrepareListener之外,而只将mediaPlayer.start()放入;在这个侦听器中,应用程序一直被卡住的原因可能是视图等待媒体加载,然后才更新到正确的信息。。。真的很高兴能帮上忙。