Java HandlerThread.getLooper()无限期阻塞

Java HandlerThread.getLooper()无限期阻塞,java,android,multithreading,android-handlerthread,android-looper,Java,Android,Multithreading,Android Handlerthread,Android Looper,我正在尝试学习如何使用HandlerThread在自己的线程中运行MediaPlayer。但我在第一步就失败了。我花了两天时间痛苦地试图理解Java/Android中的线程,真的需要一些帮助。(我读过无数的例子和javadoc页面,包括Java和Android),我感到非常沮丧/愚蠢 在下面的示例中,getLooper()无限期地阻塞。我不知道为什么。请有人告诉我如何修改下面的代码来解决这个问题 另外,一个关于如何发送消息以导致(异步)调用MediaPlayer方法的示例将非常有价值,可能会为我

我正在尝试学习如何使用HandlerThread在自己的线程中运行MediaPlayer。但我在第一步就失败了。我花了两天时间痛苦地试图理解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上,需要调用超级方法来运行:

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

重要的事情在其父类run方法中执行。更具体地说,创建了looper,如果调用getLooper()但没有创建looper,它将等待创建

来自HandlerThread.getLooper()的javadoc:

如果此线程已启动,此方法将阻塞,直到循环器已初始化

要初始化循环器,您需要从循环器的线程调用(即,它意味着从run()方法调用)

因此,在代码中执行以下操作:

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()
将为您完成此操作