我正在尝试学习如何使用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()而未创建循环程序,则它将等待其创建。