我正在尝试学习如何使用HandlerThread在其自己的线程中运行MediaPlayer。但是我在第一步失败了。我花了2天的时间试图理解Java / Android中的线程,确实需要一些帮助。 (我读了无数的示例和Javadoc页面,包括Java和Android),并且感到非常沮丧/愚蠢。

在下面的示例中,getLooper()无限期阻塞。我不知道为什么。请有人能告诉我如何修改下面的代码以解决此问题吗?

另外,有关如何发送消息(导致MediaPlayer方法被(异步)调用)的示例也非常有价值,可能可以节省一个星期的时间。

谢谢

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

最佳答案

在MediaPlayerThread上,您需要调用super方法来运行:

public void run (){
    mMediaPlayer = new MediaPlayer();
    super.run();
}


重要的事情在其父类运行方法中执行。更具体地说,将创建循环程序,如果您调用getLooper()而未创建循环程序,则它将等待其创建。

08-17 01:27