本文只是记录一些零碎的东西
今天看camera sample时发现一个好东西,HandlerThread,赶紧学习下
HandlerThread可以创建一个带有looper的线程。looper对象可以用于创建Handler类来进行来进行调度。
先看看Handler原理 :
Message 意为消息,发送到Handler进行处理的对象,携带描述信息和任意数据。
MessageQueue 意为消息队列,Message的集合。
Looper 有着一个很难听的中文名字,消息泵,用来从MessageQueue中抽取Message,发送给Handler进行处理。
Handler 处理Looper抽取出来的Message。
HandlerThread继承自Thread,当线程开启时,线程同时创建了一个含有消息队列的Looper,HandlerThread适合在只需要在一个工作线程(非UI线程)+任务的等待队列的形式。用在获取相机数据 里面真的合适不过了
看一个模拟测试
/**
* HandlerThread继承自Thread,当线程开启时,线程同时创建了一个含有消息队列的Looper,
* 并对外提供自己这个Looper对象的get方法,这就是它和普通Thread唯一不同的地方。
* 1.开发中如果多次使用类似new Thread(){...}.start()
* 任务周期长时,会使得程序运行起来越来越慢
* 而HandlerThread自带Looper使他可以通过消息来多次重复使用当前线程,节省开支;
* 2.Handler类默认绑定的是UI线程的消息队列,Looper
* 对于非UI线程又想使用消息机制,那么HandlerThread内部的Looper是最合适的,它不会干扰或阻塞UI线程。
*
*/
private final int TEST_MESSAGE1 = 0x01;
private final int TEST_MESSAGE2 = 0x02;
private Handler mHandler;
private void testHandlerThread(){
HandlerThread mHandlerThread = new HandlerThread("name");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper(),callback);
testQueue();
//or
// Handler mHandler = new Handler(mHandlerThread.getLooper());
// // use when you want to do something
// mHandler.post(new Runnable() {
// @Override
// public void run() {
// // do something
// }
// });
// quit
// try {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
// mHandlerThread.quitSafely();
// }else {
// mHandlerThread.quit();
// }
// mHandlerThread.join();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
// 模拟
private void testQueue() {
Random r = new Random();
while (true) {
int temp = r.nextInt(10);
if( temp == 3){
mHandler.sendEmptyMessage(TEST_MESSAGE1);
}else
if( temp == 6){
mHandler.sendEmptyMessage(TEST_MESSAGE2);
}
}
}
Handler.Callback callback = new Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
switch (message.what) {
case TEST_MESSAGE1:
// do something 子线程里
Log.i("slack","this is message 1...");
break;
case TEST_MESSAGE2:
Log.i("slack","this is message 2...");
break;
}
return true;// handler message
}
};
这么爽,实际项目里时刻准备着使用