2

HandlerThread を使用して、独自のスレッドで MediaPlayer を実行する方法を学習しようとしています。しかし、私は最初のステップで失敗しています。Java/Android のスレッドを理解するのに 2 日間苦労しましたが、本当に助けが必要です。(Java と Android の両方で数え切れないほどの例と javadoc ページを読みました)、非常にイライラしたり、愚かだと感じています。

以下の例では、getLooper() は無期限にブロックします。理由がわかりません。以下のコードを修正してこれを修正する方法を教えてください。

また、MediaPlayer のメソッドが (非同期で) 呼び出されるメッセージを送信する方法の例は非常に価値があり、おそらく 1 週間節約できます。

ありがとうございました

public class HandlerThreadExample {

    private MediaPlayerThread mMpThread;
    private Looper mMptLooper;
    private Handler mMptHandler;

    public HandlerThreadExample(){
        mMpThread = new MediaPlayerThread();
        mMpThread.start();
        mMptLooper = mMpThread.getLooper(); // everything freezes here
    }
    public void setMediaPlayerDataSource(Uri uri){
        // send message that calls mMediaPlayer.setDataSource(uri);
    }
    public void prepareMediaPlayer(){
        // send message that calls mMediaPlayer.prepare();
    }
    public void startMediaPlayer(){
        // send message that calls mMediaPlayer.start();
    }

    private class MediaPlayerThread extends HandlerThread {
        MediaPlayer mMediaPlayer;
        public MediaPlayerThread() {
            super("MediaPlayer Thread", HandlerThread.NORM_PRIORITY);
        }
        public void run (){
            mMediaPlayer = new MediaPlayer();
        }
    }
}
4

2 に答える 2

0

HandlerThread.getLooper() の javadoc から:

このスレッドが開始されている場合、このメソッドはルーパーが初期化されるまでブロックされます。

ルーパーを初期化するには、ルーパーのスレッドから(つまり、run() メソッドから) Looper.prepare() を呼び出す必要があります。

したがって、コードでこれを行います:

private class MediaPlayerThread extends HandlerThread {
    MediaPlayer mMediaPlayer;
    public MediaPlayerThread() {
        super("MediaPlayer Thread", HandlerThread.NORM_PRIORITY);
    }
    public void run (){
        Looper.prepare();
        mMediaPlayer = new MediaPlayer();
    }
}

@eldjon が述べたように、呼び出しによってsuper.run()これが行われます。

于 2014-08-02T09:41:38.687 に答える