线程-关于HandlerThread

HandlerThread 继承了 Thread ,也是线程的一种,只是它比一般线程多了一个 Looper ,也就是多了消息循环机制,线程 start() 时会自动创建和启动一个 Looper
当我们需要一个常驻的子线程(而不是一次性消耗品)来不定期的执行一些任务时,我们就需要创建 HandlerThread , 而不是一般的 Thread (一般的 Thread 执行完就会自动销毁)。
记得关闭 HandlerThread 线程:
这里要注意一个问题:线程不会随着应用程序的关闭而销毁,所以在退出程序时,记得在 activity OnDestroy() 里销毁你创建的 HandlerThread ,不然随着你多次打开应用,会产生多个 HandlerThread 线程。
跟其它线程一样, HandlerThread 是可不可以 随着 stop 而销毁 ,不过经过本人测试,你可以调用: getLooper().quit(); 来退出这个线程,其实原理很简单,就是改变在消息循环里面标志位,退出整个 while 循环,使线程执行完毕。
如:
protected   void  onDestroy() {
     // 这里的 workHandler 是与我创建的 HandlerThread 绑定的一个 Handler
// 你也可以用你创建的 HandlerThread.getLooper().quit();
workHandler .getLooper().quit();
super .onDestroy();
}
 
案例二:

 
public   class  MainActivity extends  Activity {
MainHandler mainHandler ; // 主线程的 handler
Handler workHandler ; // 子线程的 handler ,用于把耗时操作 post 进子线程
Button btn_start ;
Button btn_stop ;
TextView tv1 ;
 
@Override
protected   void  onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. activity_main );
btn_start  = (Button)findViewById(R.id. button1 );
btn_stop  = (Button)findViewById(R.id. button2 );
tv1  = (TextView)findViewById(R.id. tv1 );
mainHandler  = new  MainHandler();
HandlerThread workThread = new  HandlerThread( "workThread" );
workThread.start(); // 记得先启动 HandlerThread
// HandlerThread Looper 传给 workHandler ,使这个 handler 与子线程绑定
workHandler  = new  Handler(workThread.getLooper());
btn_start .setOnClickListener( new  OnClickListener() {
@Override
public   void  onClick(View v) {
workHandler .post( jiShu_run );
}
});
btn_stop .setOnClickListener( new  OnClickListener() {
@Override
public   void  onClick(View v) {
workHandler .removeCallbacks( jiShu_run );
}
});
}
class  MainHandler extends  Handler {
public  MainHandler() {
super ();
}
// 要绑定 looper 一定要复写这个构造函数
public   MainHandler (Looper looper) {
super (looper);
}
@Override
public   void  handleMessage(Message msg) {
tv1 .setText( ""  + msg. arg1 );
}
}
Runnable jiShu_run  = new  Runnable() {
int   num  = 0;
@Override
public   void  run() {
// 进行后台耗时操作,完了就把数据返回给前台更新
Message msg = mainHandler .obtainMessage();
msg. arg1  = num ;
msg.sendToTarget();
num ++;
// 1s 把此 runnable post 进子线程的 messageQueue
workHandler .postDelayed( jiShu_run , 1000);
}
};
 
@Override
protected   void  onDestroy() {
workHandler .getLooper().quit();
super .onDestroy();
}
}

猜你喜欢

转载自blog.csdn.net/Mario_faker/article/details/79619073