我启动媒体播放器在一个帖子中播放一段音乐,我想知道为什么媒体播放器可以继续工作,即使该线程已经死了。这是一个例子:
public class MusicThread extends Thread {
MediaPlayer mp;
public MusicThread(Context context) {
mp = MediaPlayer.create(context, R.raw.music);
}
@Override
public void run() {
mp.start();
Log.d("MusicThread", "mp started");
}
}
然后在活动内:
MusicThread musicThread = new MusicThread(this);
musicThread.start();
这是我的困惑:
在musicThread.start()
之后,音乐开始了。此外,线程完成,因为我们可以在Log.d(...)
中看到LogCat
生成的日志,我们可以看到false
返回的musicThread.isAlive()
。
我有musicThread
的引用,这样当它完成时它不会立即成为GC。
但媒体播放器怎么样?它继续工作,但它所驻留的线程已经死亡。在这种情况下,它似乎处于一种奇怪的状态。它仍在musicThread
中工作吗?如果是,为什么以及如何?如果没有,它在哪里?
答案 0 :(得分:2)
mp.start()
不是阻止通话。所以你的线程不会等到比赛结束。 mp.start()
调用会立即返回。你甚至不需要一个单独的线程来调用它。
PS:如果你想在播放结束时收到回调,只需使用setOnCompletionListener。播放完成后,将调用public void onCompletion(MediaPlayer mp)