Handler方法解析

2016-07-12 22:53 评论 0 条

一、摘要

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。

  1. Handler.Callback callback=new Handler.Callback() {  
  2.         @Override  
  3.         public boolean handleMessage(Message msg) {  
  4.         return false;  
  5.         }  
  6. };  

Handler的构造方法:

Handler(),默认的构造方法使用当前线程的Looper,每个Handler都默认有一个Looper对象

  1. Handler mHandler=new Handler();  

PS:Looper是一个什么类?当前线程中,Looper是一个被用于执行一个消息循环的类,默认线程没有消息循环,想要创建一个循环的消息,在运行loop循环的线程中调用prepare()方法,然后调用loop()处理消息直到循环停止。

  1. class LooperThread extends Thread {  
  2.       public Handler mHandler;  
  3.   
  4.       public void run() {  
  5.           Looper.prepare();  
  6.   
  7.           mHandler = new Handler() {  
  8.               public void handleMessage(Message msg) {  
  9.                   // process incoming messages here  
  10.               }  
  11.           };  
  12.   
  13.           Looper.loop();  
  14.       }  
  15.   }  

Handler(Handler.Callback callback),传入内部接口Handler.Callback的构造方法,重写接口的handleMessage()处理消息

  1. Handler mHandler=new Handler(callback);  

Handler(Looper looper),使用提供的Looper代替默认的Looper

  1. Handler mHandler=new Handler(looper);  

Handler(Looper looper,Handler.Callback callback),使用提供的Looper代替默认的Looper,同时传入Handler.Callback接口对象

  1. Handler mHandler=new Handler(looper,callback);  

Public Methods:

sendMessage(Message)sendEmptyMessage(int)的区别:
sendEmptyMessage(int)发送的只包含整型what值的消息,sendMessage(Message)发送的消息可以包含:what,arg1,arg2,obj值的消息,该值被存放在Message对象中。

  1. mHandler.sendEmptyMessage(0x110);  
  1. Message msg=new Message();  
  2. msg.what=0x110;  
  3. msg.arg1=100;//arg1一个int值  
  4. msg.arg2=200;//arg2一个int值  
  5. msg.obj=mList;//obj一个Object值  
  6.   
  7. mHandler.sendMessage(msg);  

post方法sendMessage方法之间的区别:post方法其中一个参数Runnable对象,允许将Runnable对象插入到消息队列,获取到消息时,执行Runnable重写的run()方法;sendMessage方法将data数据插入消息队列,重写Handler.Callback接口的handleMessage()方法或Handler子类的handleMessage()方法处理消息,这是彼此在消息队列中的不同应用。

  1. mHandler.post(new Runnable(){  
  2.          public void run(){  
  3.                   
  4.      }  
  5. });  

最终Runable对象被添加到消息队列中,Runnable将会在Handler依附的线程中执行run()方法中的内容,Runnable成功放入消息队列,返回true,否则返回false,但循环处理消息的队列还是存在的。

设计一个循环处理消息的例子,模拟计时器的效果:

  1. mHandler.post(new Runnable(){  
  2.      public void run{  
  3.               Message msg=mHandler.obtainMessage(0);//从循环的消息池取出一条消息  
  4.           mHandler.sendMessage(msg);  
  5.      }  
  6. });  
  1. Handler mHandler=new Handler(){  
  2.         @Override  
  3.         public void handleMessage(Message msg){  
  4.             super.handleMessage(msg);  
  5.   
  6.             updateView();//刷新界面  
  7.             Message message = mHandler.obtainMessage(0);  
  8.             sendMessageDelayed(message, 1000);  
  9.                  
  10.     }  
  11. }  
  1. private void updateView(){  
  2.         i++;  
  3.     mTextView.setText(""+i);  
  4. }  

当前文章价值2.83元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://www.teachcourse.cn/1953.html ,谢谢支持!

资源分享

浅谈dt.jar、tools.jar和rt.jar 浅谈dt.jar、tools.jar和rt.jar
Easy WP SMTP 插件,wordpress万网主机smtp发邮件失败解决办法 Easy WP SMTP 插件,word
ProgressBar+WebView实现自定义浏览器 ProgressBar+WebView实现自定
如何生成类似新浪微博中的长图片 如何生成类似新浪微博中的长图片