相关代码是这样的:
Uri alert = ringtoneManager.getDefaultUri(ringtoneManager.TYPE_NOTIFICATION);if (alert == null) alert = ringtoneManager.getDefaultUri(ringtoneManager.TYPE_ringtone);MediaPlayer mMediaPlayer = new MediaPlayer();mMediaPlayer.setDataSource(this,alert);final AudioManager audioManager = (AudioManager) getSystemService(Context.AUdio_SERVICE);if (audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) != 0) { mMediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); mMediaPlayer.setLooPing(false); mMediaPlayer.prepareAsync(); mMediaPlayer.start();}
这个东西工作正常,但每次播放声音时,我都会在log cat中得到这个:
WARN / MessageQueue(7508):处理程序{482f97e0}在死线程上向处理程序发送消息
我认为这可能是由于声音结束时对后台线程的回调,或者是在完成前一个播放器之前重复使用媒体播放器.有任何想法吗?
解决方法 很老的问题,但是@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(); } }}总结
以上是内存溢出为你收集整理的Android媒体播放器导致“死线程”消息全部内容,希望文章能够帮你解决Android媒体播放器导致“死线程”消息所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)