如何在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); 
+0

分享日志请 –

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

documentation for Handler

当你创建一个新的处理程序,它被绑定到线程/消息 队列中的线程是创造它

如果从流媒体音乐网络,准备播放媒体特别需要一段时间。一种选择可能是拨打prepareAsync而不是拨打prepare。在这种情况下,您应该设置OnPreparedListener,并在该回调呼叫start

+0

我试着改变准备prepareAsync和添加prepareListener,并启动媒体是它,并且应用程序不会卡住了,但音乐也不会播放.. 所以你说的是它也是posibble,我没有正确创建处理程序?创建处理程序的正确方法是什么? – shon

+0

我不认为你需要'Handler'。我并不是说你没有正确创建它。我只是觉得它没有做你期望的事情。通过创建一个'Handler'并将'Runnable'发布给它,你可以在同一个线程上运行该代码,稍后稍后,当该线程的事件循环处理你发布的事件时。 – Dave

+0

只要'MediaPlayer'不能播放,请在'OnPreparedListener'输出一些日志,以确保它被调用,并确保日志中没有警告或错误。你在问题中的代码不会调用'start',所以我不完全确定你以前如何使用它。 – Dave