HandlerThread面试详解

2017-10-24  本文已影响29人  程序猿BOSS

1、handlerThread是什么

1.1HandlerThread本质上是一个线程类,它集成了Thread

1.2HandlerThread有自己的内部Looper对象,可以进行looper循环,在HandlerThread可以创建Handler来发送和处理消息。

1.3通过获取HandlerThread的looper对象传递给Handler对象,可以在handleMessage方法中执行异步任务。

1.4优点是不会有堵塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理,处理效率较低。

1.5与线程池注重并发不同,HandlerThread是一个串行队列。HandlerThread背后只有一个线程。

示例代码:

public classMainActivityextendsAppCompatActivity {

privateHandlerThreadmHandler_thread;

privateHandlermHandler;

@Override

protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//创建一个线程,线程名字:handler-thread

mHandler_thread=newHandlerThread("handler_thread");

//开启一个线程

mHandler_thread.start();

//在这个线程中创建一个handler对象

mHandler=newHandler(mHandler_thread.getLooper()){

@Override

public voidhandleMessage(Message msg) {

super.handleMessage(msg);

//这个方法是运行在 handler-thread 线程中的 ,可以执行耗时操作

Log.d("handler ","消息: "+ msg.what+"  线程: "+ Thread.currentThread().getName()  );

}

};

}

public voidonMainThread(View view){

//在主线程给handler发送消息

//        mHandler.sendEmptyMessage(1);

//        Log.d( "handler " , "消息源线程" + Thread.currentThread().getName()  ) ;

for(inti =0;i <10;i++) {

mHandler.sendEmptyMessage(i);

}

}

public voidonChildThread(View view){

newThread(newRunnable() {

@Override

public voidrun() {

//在子线程给handler发送数据

mHandler.sendEmptyMessage(2);

Log.d("handler ","消息源线程"+ Thread.currentThread().getName()  );

}

}).start();

}

@Override

protected voidonDestroy() {

super.onDestroy();

//释放资源

mHandler_thread.quit();

}

}

上一篇下一篇

猜你喜欢

热点阅读