2017-07-31 72 views
1

我只是试图通过媒体播放器播放音乐n秒。从主文件无法在未调用Looper.prepare()的线程中创建处理程序Android Media Player

public void playMusic(String music_path) { 
    MediaPlayer mMediaPlayer = new MediaPlayer(); 

    try { 
     mMediaPlayer.setDataSource(music_path); 
     mMediaPlayer.prepare(); 
     mMediaPlayer.start(); 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mMediaPlayer.stop(); 
      } 
     }, 20000); 
     mMediaPlayer.release(); 
     Log.i(TAG, "Done Playing"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return; 
} 

我的函数调用:

public void Play_Music() { 
     mBtTestUtils.playMusic(MUSIC_PATH); 
    } 
} 

这里的时候,我这样做,我收到以下错误:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

任何帮助,将不胜感激。

+0

你是否在与主(UI)线程不同的线程上调用它? – Juan

+0

@Juan是的,我从不同的线程调用。 – taz

+0

这就是问题所在。你必须在同一个UI线程中调用它。 – Juan

回答

0

您需要在UI线程中运行您的UI相关代码。我不知道你的情况是哪一行代码。在thisthis这样的线程中运行特定的代码。

下次您可能会考虑先查找错误代码。这不完全是重复的,但非常重要。

0

有你的例外几个解决方案:

1)主叫方线程调用mBtTestUtils.playMusic(MUSIC_PATH);之前调用Looper.prepare()

2)如果你是从不同的HandlerThread调用你的函数,那么你想开始你的调用者线程。

public void Play_Music() { 
    // Starting of thread will prepare the looper (if it is handler thrad) 
    callingThread.start(); 
    mBtTestUtils.playMusic(MUSIC_PATH); 
} 

3)或在创建Handler对象,提供主线程的Looper:

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      // This will post your runnable on Main thread 
     } 
    }, 20000); 
0

你需要调用Looper.prepare()第一。您在处理程序上发布的任何内容都将转到消息队列。一个Looper遍历这个消息队列并发送执行任务。无论何时定义一个新的处理程序,它都会占用其定义的线程的Looper。除非您致电Looper.prepare(),否则新产生的线程不包含其自己的Looper,因此错误。 你可以很好地解释这个here

相关问题