HandlerThread的应用场景

HandlerThread是什么?

        它就是一个线程,一个实现了Handler通信机制的线程,也就是说不用我们再去实现Looper的一系列工作了。实现了这个功能之后,这个线程就和我们的主线程类似。我们也可以像是在主线程一样快乐的使用Handler了,而且也不用担心阻塞主线程了。

个人认为HandlerThread有以下优点:

1.众所周知普通的Thread一旦执行完,就结束。然而实际中,很多事情需要一边一边的反复执行,总不能一次次的创建线程吧!(有人会说线程池,我就呵呵,无法反驳了)

2.线程池自然是可以的,但是线程池有Handler那么顺手吗?想调用了send一个消息,不想调用了remove掉即可,不要太简单

我项目中的场景:

先上一段代码:

private void loopQuestionVoice(String fileName){
		if(fileName==null){
			handler.postDelayed(rRepeat, 10000);
			//接口,本次题目播放完毕
			playStateListener.onQuestionCompletion();
			return;
		}
		playV(fileName);//播放本条音频内容
		mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
			@Override
			public void onCompletion(MediaPlayer mp) {
				mediaPlayer.setOnCompletionListener(null);
				if(isBreak){
					return;
				}
				loopQuestionVoice(voices.poll());
			}
		});
	}

简单介绍一下,项目中有个需求:将若干个存在于队列中的音频段(代码中的voices)依次播放,播放完成10s后再次重复播放该队列语音。最初代码如上直接在主线程,因为我们用到的音频基本上都是一句话长短,所以一般是不用考虑异步处理的。但是当多个音频连续播放,外加重复的情况下就会阻塞触摸事件的处理,出现ANR异常。这时候就要需要在子线程去处理这部分了。线程池是有用过的,只不过项目中还需要暂停,清除,重新开始等功能,用线程着实不如Handler方便。

至于使用就比较简单了,如下:

 

        HandlerThread looperThread=new HandlerThread("LooperMusic");
		looperThread.start();
		handler=new Handler(looperThread.getLooper());

只是需要注意使用前需要调用start()方法;使用完记得调到quit()释放Loop

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值