如何在android中正确使用mediaPlayer?
我试图在我的应用程序中播放音乐,而媒体播放器正在加载时我想让用户继续使用该应用程序,但每次开始加载媒体播放器时,该应用程序都会卡住几秒钟,并且当媒体播放器完成加载后,只有当应用程序恢复正常并重新开始工作时,有时它不会冻结,它还会显示操作系统提示用户退出应用程序的弹出菜单。 我在google或youtube上找不到任何解决方案,有人知道我的代码有什么问题吗?如何在android中正确使用mediaPlayer?
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);
即使你正在创建一个Handler
的MediaPlayer
的创作仍然发生在主UI线程上。您应该拨打prepareAsync
或使用AsyncTask
或其他方法避免在主线程上拨打prepare
。
当你创建一个新的处理程序,它被绑定到线程/消息 队列中的线程是创造它
如果从流媒体音乐网络,准备播放媒体特别需要一段时间。一种选择可能是拨打prepareAsync
而不是拨打prepare
。在这种情况下,您应该设置OnPreparedListener
,并在该回调呼叫start
。
我试着改变准备prepareAsync和添加prepareListener,并启动媒体是它,并且应用程序不会卡住了,但音乐也不会播放.. 所以你说的是它也是posibble,我没有正确创建处理程序?创建处理程序的正确方法是什么? – shon
我不认为你需要'Handler'。我并不是说你没有正确创建它。我只是觉得它没有做你期望的事情。通过创建一个'Handler'并将'Runnable'发布给它,你可以在同一个线程上运行该代码,稍后稍后,当该线程的事件循环处理你发布的事件时。 – Dave
只要'MediaPlayer'不能播放,请在'OnPreparedListener'输出一些日志,以确保它被调用,并确保日志中没有警告或错误。你在问题中的代码不会调用'start',所以我不完全确定你以前如何使用它。 – Dave
分享日志请 –