首页 > 移动平台 > 详细

android 基础一 <Handler>

时间:2019-06-11 23:03:38      阅读:139      评论:0      收藏:0      [点我收藏+]

 

收发消息的流程:

  发消息:
   
mHandler.sendMessage()-->...-->enqueueMessage()-->将当前的Handler对象赋值给 msg.target -->最终将消息添加到消息队列 queue.enqueueMessage
  收消息:
  
  Looper.loop()-->无限循环获取消息队列的消息-->找到Handler对象(msg.target)-->回调Handler.dispatchMessage()函数-->最终调用 handleMessage();

 

 

  问题一、实例化Handler都做了什么事情
      1.Handler 无参构造函数
         public Handler() --->Looper.myLooper()
         --> 通过调用Looper.myLooper()方法,获取当前线程的Looper对象,
         如果looper为null将会抛出异常,  throw new RuntimeException( "Can‘t create handler inside thread that has not called Looper.prepare()");
          --> 通过Looper获取MessageQueue对象
 
      2.Handler 构造函数2
        public Handler(Looper looper, Callback callback, boolean async)
        -->将已经存在的Looper作为传输传递给Handler
        --> 通过Looper获取MessageQueue对象
 
  问题二、如何创建当前线程的Looper对象
      创建当前线程的Looper对象
      1.Looper.prepare();
 
      创建主线程的Looper对象(application‘s main looper),
      当应用程序运行的时候prepareMainLooper方法将会自动被调用。
      2.Looper.prepareMainLooper();
 
  问题三、怎么在子线程实例化Handler。
      1.
       class LooperThread extends Thread {
        public Handler mHandler;
 
        public void run() {
            Looper.prepare();
 
            mHandler = new Handler() {
                public void handleMessage(Message msg) {
    
                }
            };
 
            Looper.loop();
        }
    }
      2.
      mHandler = new Handler(getMainLooper()) {
               public void handleMessage(Message msg) {
    
                }
            };
  问题四、为什么子线程创建Hander发送消息需要调用 Looper.prepare();和 Looper.loop();  而主线程这不用调用以上两个方法。
     App运行的时候主线程就调用了prepareMainLooper()函数来创建Looper对象,也调用了loop()函数开启循环发送消息。所以主线程使用Hander的时候不用调prepare();
     Looper循环发消息是在Looper.loop() 函数里面执行的,所以Looper必须要被执行,否则无法发送消息。
  
 

android 基础一 <Handler>

原文:https://www.cnblogs.com/jtzp007/p/11006519.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!