为什么即使在胎面完成后MediaPlayer仍能正常工作?

时间:2013-12-12 02:07:14

标签: android multithreading

我启动媒体播放器在一个帖子中播放一段音乐,我想知道为什么媒体播放器可以继续工作,即使该线程已经死了。这是一个例子:

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中工作吗?如果是,为什么以及如何?如果没有,它在哪里?

1 个答案:

答案 0 :(得分:2)

mp.start()不是阻止通话。所以你的线程不会等到比赛结束。 mp.start()调用会立即返回。你甚至不需要一个单独的线程来调用它。

PS:如果你想在播放结束时收到回调,只需使用setOnCompletionListener。播放完成后,将调用public void onCompletion(MediaPlayer mp)