一、摘要
Handler用于发送和处理消息,Runnable对象和MessageQueue有关,每一个Handler实例是一个单一的线程和线程的消息堆栈。创建一个新的Handler,它会绑定到创建它的线程或消息堆栈,从这点讲,它会发送消息和可以运行到消息堆栈,并从消息堆栈取出执行。
Handler有两个主要的用途:(1)计划消息可运行到将来的某个时间点执行;(2)可在不同于你拥有的线程中插队可被执行的动作
计划的消息使用以下的方法实现:
post(Runnable),postAtTime(Runnable,long),postDeplayed(Runnable,long),sendEmptyMessage(int),sendMessage(Message),sendMessageAtTime(Message,long)和sendMessageDelayed(Message,long)。post方法允许插入Runnable的对象被消息队列调度,sendMessage方法允许插入一个包含着data数据Message的对象由handleMessge(Message)方法处理。
当宣布或发送一个Handler,你不是尽可能快让消息队列读取处理就是延时或某个指定时间处理,后者允许实现timeouts、ticks和其它时间行为。
当是当前application创建一个进程时,它的UI Thread被用于运行消息队列,管理高级别的application对象(activities,BroadcastReceiver等)。你可以创建属于自己的线程通过Handler和主application的线程通信反馈。这样做依旧通过子线程调用post或sendMessage方法。传递的Runnable或Message被计划在Handler的消息队列处理。
Handler方法解析
Handler.Callback内部接口,声明了handleMessage(Message)方法,作用处理消息队列,代替Handler声明的内部方法handleMessage(Message),避免重写的繁琐,接口方法返回true,表示消息处理完成,否则返回false。
- Handler.Callback callback=new Handler.Callback() {
- @Override
- public boolean handleMessage(Message msg) {
- return false;
- }
- };
Handler的构造方法:
Handler(),默认的构造方法使用当前线程的Looper,每个Handler都默认有一个Looper对象
- Handler mHandler=new Handler();
PS:Looper是一个什么类?当前线程中,Looper是一个被用于执行一个消息循环的类,默认线程没有消息循环,想要创建一个循环的消息,在运行loop循环的线程中调用prepare()方法,然后调用loop()处理消息直到循环停止。
- class LooperThread extends Thread {
- public Handler mHandler;
- public void run() {
- Looper.prepare();
- mHandler = new Handler() {
- public void handleMessage(Message msg) {
- // process incoming messages here
- }
- };
- Looper.loop();
- }
- }
Handler(Handler.Callback callback),传入内部接口Handler.Callback的构造方法,重写接口的handleMessage()处理消息
- Handler mHandler=new Handler(callback);
Handler(Looper looper),使用提供的Looper代替默认的Looper
- Handler mHandler=new Handler(looper);
Handler(Looper looper,Handler.Callback callback),使用提供的Looper代替默认的Looper,同时传入Handler.Callback接口对象
- Handler mHandler=new Handler(looper,callback);
Public Methods:
sendMessage(Message)和sendEmptyMessage(int)的区别:
sendEmptyMessage(int)发送的只包含整型what值的消息,sendMessage(Message)发送的消息可以包含:what,arg1,arg2,obj值的消息,该值被存放在Message对象中。
- mHandler.sendEmptyMessage(0x110);
- Message msg=new Message();
- msg.what=0x110;
- msg.arg1=100;//arg1一个int值
- msg.arg2=200;//arg2一个int值
- msg.obj=mList;//obj一个Object值
- mHandler.sendMessage(msg);
post方法和sendMessage方法之间的区别:post方法其中一个参数Runnable对象,允许将Runnable对象插入到消息队列,获取到消息时,执行Runnable重写的run()方法;sendMessage方法将data数据插入消息队列,重写Handler.Callback接口的handleMessage()方法或Handler子类的handleMessage()方法处理消息,这是彼此在消息队列中的不同应用。
- mHandler.post(new Runnable(){
- public void run(){
- }
- });
最终Runable对象被添加到消息队列中,Runnable将会在Handler依附的线程中执行run()方法中的内容,Runnable成功放入消息队列,返回true,否则返回false,但循环处理消息的队列还是存在的。
设计一个循环处理消息的例子,模拟计时器的效果:
- mHandler.post(new Runnable(){
- public void run{
- Message msg=mHandler.obtainMessage(0);//从循环的消息池取出一条消息
- mHandler.sendMessage(msg);
- }
- });
- Handler mHandler=new Handler(){
- @Override
- public void handleMessage(Message msg){
- super.handleMessage(msg);
- updateView();//刷新界面
- Message message = mHandler.obtainMessage(0);
- sendMessageDelayed(message, 1000);
- }
- }
- private void updateView(){
- i++;
- mTextView.setText(""+i);
- }
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/1953.html ,谢谢支持!