Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确使用mediaPlayer?_Java_Android_Android Mediaplayer_Media - Fatal编程技术网

Java 如何正确使用mediaPlayer?

Java 如何正确使用mediaPlayer?,java,android,android-mediaplayer,media,Java,Android,Android Mediaplayer,Media,我正在尝试在我的应用程序中播放音乐,当媒体播放器加载时,我希望允许用户继续使用该应用程序,但每次我开始加载媒体播放器时,该应用程序都会被卡住几秒钟,当媒体播放器加载完后,该应用程序才会恢复正常并重新开始工作,有时它不仅仅是冻结,它还显示操作系统的弹出菜单,提示用户退出应用程序 我在谷歌或YouTube上找不到任何解决方案,有人知道我的代码出了什么问题吗 final Handler handler = new Handler(); Runnable runnable = new Runnable(

我正在尝试在我的应用程序中播放音乐,当媒体播放器加载时,我希望允许用户继续使用该应用程序,但每次我开始加载媒体播放器时,该应用程序都会被卡住几秒钟,当媒体播放器加载完后,该应用程序才会恢复正常并重新开始工作,有时它不仅仅是冻结,它还显示操作系统的弹出菜单,提示用户退出应用程序

我在谷歌或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);

即使您正在创建一个
处理程序
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()放入;在这个侦听器中,应用程序一直被卡住的原因可能是视图等待媒体加载,然后才更新到正确的信息。。。真的很高兴能帮上忙。