秒懂Android Handler和Looper消息原理

在理解Android Handler消息机制原理前请务必理解Threadlocal使用特点

推荐文章https://www.jianshu.com/p/f2ff9c38c5be

下面是我对Threadlocal的理解可供参考:

  1. 每个线程都可以通过ThreadLocal来存储并获取保存的数据,多个线程之间是相互独立的。
  2. ThreadLocal在当前线程操作数据只对当前线程有效
  3. ThreadLocal之所以能够在不同的线程中存储数据副本,是因为每个Thread都有一个Values对象,该对象中的table数组进行真 正的存储。当我们使用ThreadLocal的get或者set方法时,会更据当前线程获取到该线程内部的Values对象,然后获取内部的values数组,最后在进行数据的存储或删除。

举个例子:

在application中通过

ThreadLocal local = new ThreadLocal();
local.set("马化腾祸害青少年");

之后在所有的activity界面(主线程)中都可以通过local.get()获取到"马化腾祸害青少年"
但是在子线程中获取到的就是null

这里与application中保存的全局变量有区别的:

  • 全局变量:所有位置都可以访问
  • ThreadLocal:仅限同一个线程之间

通过上面理解好ThreadLocal的使用,恭喜你已经基本了解Android Handler和Looper的使用关系了

----------------------------------分割线------------------------

下面是对Android Handler和Looper的三句理解:

  1. 主线程创建时会创建Looper,并存放到ThreadLocal中,而Looper中会创建messageQueue;
  2. 主线程中创建的Handler时可以通过ThreadLocal获得主线程中保存的Looper和messageQueue;
  3. 通过Handler发送消息到messageQueue中,Looper.loop()不断的轮询取出消息,发送到指定的Handler中运行

提示: 子线程创建的Handler更新界面,需设置Looper为Looper.getMainLooper()

new Thread(new Runnable() {
            @Override
            public void run() {
				// 设置main looper	
                new Handler(Looper.getMainLooper()){
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                    }
                };
            }
 }).start();

举个例子:

  1. 程序启动时,系统会创建好 main thread -> Looper -> messagQueue
  2. activity中创建的Handler(在主线程中),就可以通过ThreadLocal获得Looper 和 messagQueue,之后通过Handler将消息发送到messagQueue中,Looper轮询取出消息发送到对应的Handler中执行

有写错的地方还望指教。

更详细的源码讲解百度上很多,这里就列了下自己的理解,希望对你有帮助

你可能感兴趣的:(android进阶)