我正在学习如何在自己的线程中运行MediaPlayer,使用HandlerThread。但我第一步就失败了。我花了2天时间痛苦地试图理解Java/Android线程,真的需要一些帮助。(我读了无数的例子和javadoc页面,包括Java和Android),我感到非常沮丧/愚蠢。
在下面的例子中,getloop()无限阻塞。我也不知道为什么。请有人告诉我如何修改下面的代码来解决这个问题?
此外,如何发送消息导致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中你需要调用run的超级方法:
public void run (){
mMediaPlayer = new MediaPlayer();
super.run();
}
重要的东西在它的父类run方法中执行。更具体地说,循环被创建,如果你调用getloop()而循环没有被创建,它将等待它的创建。
从handlerthread . getloop()的javadoc:
如果这个线程已经启动,这个方法将阻塞直到循环器初始化。
要初始化循环器,你需要从循环器的线程中调用loop .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()
将为您完成此操作。