2017-07-31 21 views
1

Media Playerでn秒間だけ音楽を再生しようとしています。私はこれを行うとき、ここでLooper.prepare()を呼び出していないスレッド内でハンドラを作成できません。Android Media Player

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

私は次のエラーを取得する:

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

任意の助けをいただければ幸いメインファイルからMy機能発信者が

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; 
} 

+0

メイン(UI)スレッドとは異なるスレッドでこれを呼び出していますか? – Juan

+0

@Juanはい、別のスレッドから呼び出しています。 – taz

+0

それが問題です。同じUIスレッドで呼び出す必要があります。 – Juan

答えて

0

UI関連のコードをUIスレッドで実行する必要があります。私はあなたの場合にどのコード行があるのか​​わかりません。特定のコードをthisまたはthisのようなスレッドで実行します。

次回は、エラーコードを最初に調べることをおすすめします。これはちょうど重複ではありませんが、かなりです。

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)またはハンドラオブジェクトを作成しながら、メインスレッドルーパー提供:

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

最初Looper.prepare()を呼び出すためにあなたが必要なの。ハンドラに投稿するものはすべてメッセージキューに移動します。ルーパーはこのメッセージキューをループし、実行するタスクを送信します。新しいハンドラを定義するたびに、それが定義されているスレッドのルーパーが必要になります。 Looper.prepare()を呼び出さない限り、新しく生成されたスレッドには独自のLooperが含まれていないため、エラーになります。 これについての良い説明はhereです。

関連する問題