今天来说说Android一个重要类吧:Handler

(我写的博客风格不适合新手,因为我讨厌新手教学,我都是直奔主题,不交代前因后果)

大家都知道Handler的用法一般是线程间的通讯,当然,一个线程内也可以用Handler来通讯。

Handler发消息和回消息有三种回调方式:

第一种,比较少见,sendmessage

private Handler mHandler = new Handler(new Handler.Callback() {

        @Override
public boolean handleMessage(Message msg) { return false;
}
});

第二种,常见的:sendmessage()之后在handleMessage里面处理消息

private Handler mHandler2 = new Handler() {
@Override
public void handleMessage(Message msg) {
}
}

第三种,更常见的post,回调方法是run。。。不要看到run就认为是在别的线程,这里run是在主线程里

new Handler().post(new Runnable() {

            @Override
public void run() {
// TODO Auto-generated method stub }
});

有兴趣的可以看看Handler的源码,回调的时候有判断这三种情况,决定具体回调哪一个

注意:Handler的默认构造方法是获取当前线程的Looper,而默认的一个线程是不带Looper的,需要再线程中定义Handler,就需要Looper.looper()

private class Customthread implements Runnable {

        @Override
public void run() {
//线程中启动Looper,开始消息循环
Looper.prepare();
Handler hander = new Handler() {
public void handleMessage(Message msg) {
Log.i(TAG, "77777" + "当前线程为:" + Thread.currentThread());
}
};
hander.sendEmptyMessage(1);
hander.sendEmptyMessage(1);
Looper.loop();
} }

这样Handler才会收到消息,看了源码就知道,Looper.prepare()就是创建了一个Looper,然后开始循环读取消息

如果不想这么麻烦怎么办呢,在Handler的构造方法里面写Looper.getMainLooper()就可以了,这样Handler就是用UI线程的Looper,消息的队列是UI线程的队列

另外再说一个类吧,HandlerThread,不想像上面这么麻烦的话,就建一个HandlerThread类,这个线程自带Looper和消息循环,IntentService就是这么设计的,看看源码就知道了 。

准备睡觉了。。。感谢各位粉丝的关注和留言,下回咱说说View的传递机制

细说Handler的更多相关文章

  1. nginx -- handler模块(100%)

    handler模块简介 相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识.基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-ba ...

  2. Android 异步消息处理机制终结篇 :深入理解 Looper、Handler、Message、MessageQueue四者关系

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.概述 我们知道更新UI操作我们需要在UI线程中操作,如果在子线程中更新UI会发生异常可能导致崩溃,但是在UI线程中进行耗时操作又会导致ANR,这 ...

  3. 【转】从源码分析Handler的postDelayed为什么可以延时?

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/aliankg/article/details/70842494Thread/Hander/Loope ...

  4. C#细说多线程

    引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发.其中委托的BeginInvoke方法以及回调函数最为常用.而 I/O线程可能 ...

  5. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  6. Android 开发 深入理解Handler、Looper、Messagequeue 转载

    转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/73484527 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底 ...

  7. Spring MVC的handlermapping之请求分发如何找到正确的Handler(BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping)

    本文讲的是Spring MVC如何找到正确的handler, 前面请求具体怎么进入到下面的方法,不再细说. 大概就是Spring mvc通过servlet拦截请求,实现doService方法,然后进入 ...

  8. [转]C#综合揭秘——细说多线程(下)

    引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用. 而 I/O线程 ...

  9. Vuex细说

    vuex 1,什么是 vuex? vuex 是一个专门为 vue.js 应用程序 开发的状态管理模式+库 它充当应用程序中所有组件的集中存储(数据状态) ,其规则确保状态只能以可预测的方式进行变更 并 ...

随机推荐

  1. 获取openId | 小程序

    最近项目中需要使用微信授权,继上一篇<关于微信小程序拒绝授权后,重新授权并获取用户信息>之后,需要获取用户的openId,开发测试时,发现无论如何都获取不到: 官方文档如下: 相信很多同学 ...

  2. 关于python编译的一点小结

    大家都知道python是脚本语言,源码可以直接执行,有时需要提高执行效率或者保密(因为有时候不想让使用人看到源码文件),那就涉及到python编译了,那么该如何做呢? 有两种方法可以做到. 1.一种是 ...

  3. struts2+hibernate+spring配置版框架搭建以及简单测试(方便脑补)

    为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ...

  4. 百度导航试用 vs 高德导航

    听说百度导航免费了,下载试用了一下: HUD模式不错,但是需要一个手机支架或挂钩.尤其是HUD景象模式,夜间把手机平放,通过前挡风玻璃反射看.这个功能有点乔布斯的感觉了. 不过路径规划还差一点,和凯立 ...

  5. DELPHI XE8 远程调试

    最近公司项目遇到问题需要远程调试搜索了一下怎么用 发现网上能找到最新的是XE2上的说明现在已经有一些不同了 按照上面的方法不能调试成功 经过测试XE8的方法如下:1.项目编译设置:2.在被调试电脑上运 ...

  6. grunt中常见的插件

    /** * 需要用到的文件夹有 js(src) css image html */ gulp是一种自动化构建工具,可以增强我们的工作流程,他是基于 Node.js 构建的,与gruntjs相比,gul ...

  7. 安装npm及cnpm(Windows)

    [工具官网] Node.js : http://nodejs.cn/ 淘宝NPM: https://npm.taobao.org/ [安装步骤] 一.安装node.js 1.前往node.js官网下载 ...

  8. 在64位Ubuntu系统上安装32位程序包

    在64位Ubuntu系统上安装32位的程序包 $sudo apt-get install package_name:i386 例如: $sudo apt-get install openjdk-7-j ...

  9. Spring的JDBC(非web程序)的简单例子

    第一步: spring配置applicationContext.xml文件,放在src下面: <?xml version="1.0" encoding="UTF-8 ...

  10. Vue.js 介绍入门

    Vue.js 的目标 是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.Vue.js 是一个用于创建 Web 交互界面的库.它让你通过简单而灵活的 API 创建由数据驱动的 UI 组件. ...