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