Android 从源码看Handler消息机制

原创 2017年01月03日 11:23:41

今天闲的无聊,实在不知道干嘛了,就想起来android中很重要的一个东西,消息机制,也就是我们常说的handler消息机制,下面我们就来一起看看;
1 实例化Handler


    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

        }
    };

    我们来看看Handler里面的handleMessage的方法说明,有这么一句话:
    /**
     *子类必须实现,虽然不是抽象方法 
     * Subclasses must implement this to receive messages.
     */
    public void handleMessage(Message msg) {
    }

2 分发消息


    /**
     * Handle system messages here.
     */
    public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

我们一般使用message只会给what和obj赋值,其实Message还有其他字段,如callBack,而mallback就Handler里面的一个接口,只有在使用public Handler(Callback callback, boolean async) 重载方法的时候才会给他赋值,所以这里他是null,这样就直接调用了Handler的handleMessage方法,讲消息分发到了我们重写的handleMessage方法再进行处理;

3 获取msg

public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool;
                sPool = m.next;
                m.next = null;
                m.flags = 0; // clear in-use flag
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }

或者new Message()都可以;

4 发送消息


    private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
        msg.target = this;
        if (mAsynchronous) {
            msg.setAsynchronous(true);
        }
        return queue.enqueueMessage(msg, uptimeMillis);
    }

源码中消息最终在这里加入消息队列,而这个方法就是Handler里面的方法,this指的就是Handler,可以看出,每一个Message都有一个标记。

5 消息队列
如果在主线程中new Handler的话,系统或初始化一个,所以我们可以直接用:

private Looper(boolean quitAllowed) {
        mQueue = new MessageQueue(quitAllowed);
        mThread = Thread.currentThread();
    }

如果在子线程:

public static void prepare() {
          prepare(true);
      }

    private static void prepare(boolean quitAllowed) {
          if (sThreadLocal.get() != null) {
              throw new RuntimeException("Only one Looper may be created per thread");
          }
          sThreadLocal.set(new Looper(quitAllowed));
     }

   private Looper(boolean quitAllowed) {
         mQueue = new MessageQueue(quitAllowed);
         mThread = Thread.currentThread();
     }

子线程要先prepare,可以看出其实最终都是调用的Looper这个方法;
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android消息机制Handler解析(源码+Demo)

Handler是开发人员在面试过程中最常见的问题之一了,这篇文章将较为全面地对Handler进行解读,包括源码层,以及使用方法。 如果看完文章有疑问,欢迎在评论中一起探讨 基本内容包括: 看完文章...
  • chen_lian_
  • chen_lian_
  • 2016年04月01日 00:25
  • 4556

从源码看Handler消息机制

handler简介,详述,还有解决一些常见问题
  • xiong_hui_hui
  • xiong_hui_hui
  • 2016年04月26日 01:40
  • 186

handler消息机制源码解析

1, 基本概念 Handler主要做什么?机制是怎样的?有其他相同或者类似的机制吗? 我们知道,Binder主要用于跨进程通信,Handler呢?主要用于进程内部进行通信,或者说进程内部不同线程之间进...
  • u012439416
  • u012439416
  • 2016年09月14日 21:48
  • 831

面试时最常问到的Handler消息机制源码详解

前言辞职后,最近又开始加入找工作的大军中了。不得不说今年找工作确实比以前难了。从几个朋友说他们公司快倒闭的情况也验证了这一点。最近面了2家,竟然都问到了Handler消息机制,虽然以前看过源码,但是很...
  • Alpha58
  • Alpha58
  • 2017年05月07日 13:50
  • 670

Android消息机制Handler的实现原理解析

[ Android消息机制Handler的实现原理解析]Android的主线程为什么可以一直存在? 线程是一个动态执行的过程,从产生到死亡包括五个状态:新建、就绪、运行、死亡和堵塞。只要线程没有执...
  • lyl278401555
  • lyl278401555
  • 2016年07月05日 10:30
  • 2081

从源码看Android消息机制

说到Android的消息机制自然会想到Handler、Message、MessageQueue、Looper这几个类。用一句话概括Android消息机制的过程:通过Handler的sendMessag...
  • u010389578
  • u010389578
  • 2017年11月20日 22:35
  • 46

Android面试题(五)—— Android的消息机制

前言Handler是Android消息机制的上层接口,平时使用起来很方便,我们可以通过它把一个任务切换到Handler所在的线程中去运行。而最常用的就是拿来从子线程切换到主线程以便更新UI。关于And...
  • a471893438
  • a471893438
  • 2016年08月01日 13:45
  • 714

Android中AsyncTask(异步任务)和Handler(线程消息机制)的详解

AsyncTask生来就是处理一些后台的比较耗时的任务,给用户带来良好用户体验的,从编程的语法上显得优雅了许多,不再需要子线程和Handler就可以完成异步操作并且刷新用户界面。Android官网总结...
  • qq_22118507
  • qq_22118507
  • 2016年05月18日 10:16
  • 1242

Handler(消息机制)的常用场景总结

1、安卓为什么只能通过消息机制更新UI呢? 最根本的目的就是解决多线程并发问题。(多个线程同时执行一个任务) 假如在一个Activity中,有多个线程去更新UI,并且都没有加锁机制,那就会造成更新UI...
  • chenrushui
  • chenrushui
  • 2016年10月09日 10:37
  • 939

Android的消息机制——Handler的工作过程

在Android系统中,出于对性能优化的考虑,对于Android的UI操作并不是线程安全的。也就是说若是有多个线程来操作UI组件,就会有可能导致线程安全问题。所以在Android中规定只能在UI线程中...
  • ljd2038
  • ljd2038
  • 2016年03月14日 20:54
  • 7173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 从源码看Handler消息机制
举报原因:
原因补充:

(最多只允许输入30个字)