与Handler有关的几个概念
注: 相关图片都是用的别人的
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);}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。