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
文章最后发布于: 2018-07-26 14:33:05
相关阅读
HandlerThread是什么 官方解释 Handy class for starting a new thread that has a looper. The looper can then be used to cre
Android多线程:HandlerThread详细使用手册
前言 多线程的应用在Android开发中是非常常见的,常用方法主要有:继承Thread类 实现Runnable接口 Handler AsyncTask HandlerThread
Android HandlerThread使用介绍以及源码解析
1. 前言 首先,看一下官方对HandlerThread的解释: Handy class for starting a new thread that has a looper. The looper can th