2017-07-31 85 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

相關問題