Android Handler机制(一) 为什么设计Handler

一. 前言

        做安卓开发也有好几年了, 一直在用Hanlder, 都是为了做项目功能实现就完了,核心原理研究的不深,平时有什么问题都是看下博客也能够解决,积累的都是零散的,过段时间忘了又得重新去翻, Android一直是开源的,Handler解析的博客文章网上也很多,别人的总是别人的, 自己总结的才算是自己的理解, 当然在引用别人的理解时我也会注明出处,要尊重他人的劳动成果, 原创不易.  刚好最近有时间,把Handler机制重新梳理一遍, 加入自己工作中的理解. 总结出来.希望对其他人有帮助.

 

二. 设计Handler的初衷

在分析Handler之前,我们先来认识这两个概念

1. 同步与异步的区别

概念理解可以参考笔者: java基础系列(七) 同步和异步理解_broadview_java的博客-CSDN博客 

2. 多线程概念

        java中的多线程通信

 java中有很多方法实现多线程之间的通信, 比较典型的:

通过 synchronized 关键字以“上锁”机制实现线程间的通信。多个线程持 有同一个对象,他们可以访问同一个共享变量,利用 synchronized“上锁” 机制,哪个线程拿到了锁,它就可以对共享变量进行修改,从而实现了通信。

使用 Object 类的 wait/notify 机制,执行代码 obj.wait();后这个对象 obj 所在的线程进入阻塞状态,直到其他线程调用了 obj.notify();方法 后线程才会被唤醒。
 

        Android中的多线程

在java中的多线程通信方式中有个共同的特点: 那就是引入同步锁, 当然间接的就是有线程会被阻塞. 利用synchronized机制拿不到锁的线程需要等拿到锁了才会继续执行操作, obj.wait();需要等 obj.notify();才会继续执行操作。

虽然 Android 系统是由 Java 封装的,但是由于 Android 系统的特殊性,Google 的 开发人员对 Android 线程的设计进行了改造。他们把启动 APP 时运行的主线程定 义为 UI 线程.

UI 线程负责所有你能想到的所有的跟界面相关的操作,例如分发绘制事件,分 发交互事件等可多了。由于其特殊性 Android 系统强制要求以下两点

1. 为保持用户界面流畅 UI线程不能被阻塞,如果线程阻塞界面会卡死,若干秒后 Android 系统抛出 ANR。

2. 除 UI线程外其他线程不可执行 UI 操作.

三. Android 多线程通信

        既然 UI 线程中不能被阻塞,那么查询数据库和访问网络这类的耗时操作肯定就 不能在 UI 线程中执行了,我们就需要单独开个线程操作。

        但是除 UI 线程外其他线程又不可执行 UI 操作,最后还是要回到 UI 线程更新 UI, 这就需要多线程之间的通信。

        可 Java 中线程间通信又都是阻塞式方法,所以传统的 Java 多线程通信方式在 Android 中并不适用. 因此 Google 开发人员就不得不设计一套 UI 线程与 Worker 工作线程通信的方法 . 

目的:   既能实现多线程之间的通信,又完美解决 UI 线程不能被阻塞的问题.

具体方法 有以下几类:

1. view.post(Runnable action)系列,通过 View 对象引用切换回 UI 线程.

具体使用和原理,请查看笔者这篇文章: Android UI控件延迟显示 View.postDelayed() 方法使用及思考_broadview_java的博客-CSDN博客

2. activity.runOnUiThread(Runnable action)方法,通过 Activity 对象引用切换 回 UI 线程.

3. AsyncTask,内部封装了 UI 线程与 Worker 线程切换的操作.

4. Handler, 异步消息处理机制,多线程通信.

四. 总结     

        Handler 是Android系统中线程间通信的使者, 它是非常重要的, 你可以看看AMS中 四大主件生命周期的管理都是通过Handler分发消息, 然后再处理对应的逻辑.

        说到了这里应该大概明白了当初设计 Handler 的初衷。 由于 Android 系统的特殊性创造了 UI 线程。 由于 UI 线程的特殊性创造了若干个 UI 线程与 Worker 线程通信的方法。 在这若干个线程通信方法中就包含了 Handler。 Handler 就是针对 Android 系统中与 UI 线程通信而专门设计的多线程通信机制
       

五. 感谢

        感谢享学课堂的老师分享这么好的干货,  如果有新的理解,也会加入到文章中, 后续更新.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值