【问题标题】:How to use mediaPlayer correctlty?如何正确使用媒体播放器?
【发布时间】:2017-09-15 11:56:16
【问题描述】:

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

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

【问题讨论】:

  • 请分享日志

标签: java android android-mediaplayer media


【解决方案1】:

即使您正在创建HandlerMediaPlayer 的创建仍会在主 UI 线程上进行。您应该调用prepareAsync 或使用AsyncTask 或其他方式来避免在主线程上调用prepare

来自documentation for Handler

当你创建一个新的Handler时,它会绑定到线程/消息 创建它的线程的队列

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

【讨论】:

  • 我尝试将 prepare 更改为 prepareAsync 并添加 prepareListener 并在其旁边启动媒体,应用程序不再卡住但音乐也不会播放..所以你说它也有可能我没有正确创建处理程序吗?创建处理程序的正确方法是什么?
  • 我认为你根本不需要Handler。我并不是说您没有正确创建它。我只是认为它没有按照您的预期做。通过创建Handler 并将Runnable 发布到它,您将在同一个线程上运行该代码,只是在稍后该线程的事件循环处理您发布的事件时。
  • 至于MediaPlayer没有播放,请在OnPreparedListener中输出一些日志,以确保它正在被调用,并确保日志中没有警告或错误。你在问题中的代码没有调用start,所以我不完全确定你之前是如何使用它的。
  • 我刚刚解决了这个问题,非常感谢戴夫,你真的很有帮助。从开发应用程序的第一天开始我就遇到了这个问题,最终解决了这个问题......我的错误是在 PrepareListener 之外更改了媒体控件(所有视图按钮等),并且只放置了 mediaPlayer.start( );在 thist 监听器内部,所以应用程序一直卡住的原因可能是视图正在等待媒体加载,然后它们才会更新到正确的信息......真的,TNX 很多 :)跨度>
  • 很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多