我正在尝试使用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();
}
}
}
答案 0 :(得分:1)
public void run (){
mMediaPlayer = new MediaPlayer();
super.run();
}
重要的事情在其父类运行方法中执行。更具体地说,创建了looper,如果你调用getLooper()并且没有创建looper,它将等待它的创建。
答案 1 :(得分:0)
来自HandlerThread.getLooper()的javadoc:
如果此线程已启动,则此方法将一直阻塞,直到looper已初始化为止。
要初始化循环器,您需要从循环器的线程中调用Looper.prepare() (即它意味着来自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()
会为你做这件事。