注: 相关图片都是用的别人的

1.Handler主要用于消息处理

2.Message:消息,子线程向UI线程发送消息,消息中携带者相应数据。

3.MessageQueue:消息队列,有一个格Message消息组成

4.Looper:信息泵,循环处理消息队列MessageQueue中的Message,将其发送给相应的Handler

5.带Looper的Thread,如果要非UI线程中实例化Handler,必须有Looper,而一般子线程中是不存在Looper的,一个线程可以有一个Looper对象和一个MessageQueue,必行显示调用Looper.loop()方法给其分配出Looper对象才能使用。

一个线程对应一个Looper。

一个Looper对应一个MessageQueue。

一个Looper可以对应多个Handler。

记住:HandlerThread=普通Thread+Looper

详细的运行过程看下两图:

一.Handler的方法使用

Handler可以将两种类型消息放到消息队列中,一种是Message另种是Runnable对象,如果是Message对象时,通过Handler的handleMessage()方法处理,如果是Runnable对象的时候,当Handler拿到Looper发送过来的Runnable对象的时候,会直接运行Runnable的run()方法,注意Runnable对象时运行在相应Handler所在的线程中的(一般是UI线程),没有start,直接调用了run()方法。

/****handler.post(Runnable);***/handler.post(newRunnable(){@Overridepublicvoidrun(){isChanging=true;bar.setProgress(count);count++;}});/*****hanlder.postDelayer(Runnable,timeDelayed);**/handler.postDelayed(newRunnable(){@Overridepublicvoidrun(){isChanging=true;bar.setProgress(count);count++;}},100);/***重点看一下handler是怎么发送msg的**1.可以发送空的Message*2.可以定时发送Message*3.Message可以携带的数据有intwhat,intarg1,intarg2,Objectobj,Bundlebundler(通过msg.setData(Bundlebundler)来添加到Message对象中)**4.Message通过Handler.obtain()方法实例化,可以进行有参、无参实例化,其中有参实例化是可以出传入intwhat,intarg1,intarg2,Objectobj*@authorVicentTung**//***1.发送空的Message*/handler.sendEmptyMessage(0);handler.sendEmptyMessageAtTime(0,System.currentTimeMillis());handler.sendEmptyMessageDelayed(0,100);/***2.发送非空Message(Message是new出来的)*/Messagemsg=newMessage();Bundledata_bundle=newBundle();data_bundle.putString("name","小明");data_bundle.putInt("age",12);msg.arg1=1;msg.arg2=2;msg.what=3;msg.obj="success";msg.setData(data_bundle);handler.sendMessageDelayed(msg,100);/***3.发送非空Message(Message是handler.obtain()出来的)*/Stringobj="hahah";intarg1=111;intarg2=222;Messagemsg_obtain=handler.obtainMessage();/***各种各样的带参数的obtain()方法实例化出Message对象*/msg_obtain=handler.obtainMessage(what);msg_obtain=handler.obtainMessage(what,obj);msg_obtain=handler.obtainMessage(what,arg1,arg2);msg_obtain=handler.obtainMessage(what,arg1,arg2,obj);/***4.Message的移除*/if(handler.hasMessages(0)){handler.removeMessages(0);}