Android媒体播放器导致“死线程”消息

时间:2011-07-26 09:49:27

标签: android multithreading media-player

1 个答案:

答案 0 :(得分:4)

非常古老的问题,但@Alex'xkcd link说服我回答它。

我有一个非常相似的情况,并且能够通过Runnable实例化MediaPlayer来实现所需的结果。在我的例子中,IntentService调用正在进行的服务,该服务负责媒体播放。我的解决方案如下(仅限相关代码):

public class HelperService extends Service {

    public void play() {
        Thread thread = new Thread(new Runnable() {
            public void run() {
                soundStart();
            }
        });
        thread.start();
    }

    private void soundStart() {
        try {
            AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(R.raw.sound);
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_RING);

            mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    mp.reset();
                    return false;
                }
            });

            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    // do stuff
                }
            });

            mMediaPlayer.prepare();
            mMediaPlayer.start();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}