细说Handler
今天来说说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的更多相关文章
- nginx -- handler模块(100%)
handler模块简介 相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识.基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-ba ...
- Android 异步消息处理机制终结篇 :深入理解 Looper、Handler、Message、MessageQueue四者关系
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.概述 我们知道更新UI操作我们需要在UI线程中操作,如果在子线程中更新UI会发生异常可能导致崩溃,但是在UI线程中进行耗时操作又会导致ANR,这 ...
- 【转】从源码分析Handler的postDelayed为什么可以延时?
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/aliankg/article/details/70842494Thread/Hander/Loope ...
- C#细说多线程
引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发.其中委托的BeginInvoke方法以及回调函数最为常用.而 I/O线程可能 ...
- 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 ...
- Android 开发 深入理解Handler、Looper、Messagequeue 转载
转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/73484527 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底 ...
- Spring MVC的handlermapping之请求分发如何找到正确的Handler(BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping)
本文讲的是Spring MVC如何找到正确的handler, 前面请求具体怎么进入到下面的方法,不再细说. 大概就是Spring mvc通过servlet拦截请求,实现doService方法,然后进入 ...
- [转]C#综合揭秘——细说多线程(下)
引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用. 而 I/O线程 ...
- Vuex细说
vuex 1,什么是 vuex? vuex 是一个专门为 vue.js 应用程序 开发的状态管理模式+库 它充当应用程序中所有组件的集中存储(数据状态) ,其规则确保状态只能以可预测的方式进行变更 并 ...
随机推荐
- 全景技术大揭秘,市场核心早洞悉——VR全景加盟
未来已来,未来已见.2017是3D全景创业的天时,全景行业逐步走向成熟.全景智慧城市专注vr全景6年,技术国内遥遥领先.全景智慧城市市场总监常诚,透漏3D全景技术和市场的核心. 拍摄全景必备的设备:单 ...
- coreCLR系列随笔 之ClrJit项目之alloc.cpp文件分析(1)
首先声明,自己对CLR了解得不多,只是个人爱好,可能有错误,请指出,文件源码如下(可能不是最新的) // // Copyright (c) Microsoft. All rights reserved ...
- 【 js 基础 】【 源码学习 】源码设计 (持续更新)
学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析第二部分:undersc ...
- 为什么使用dojo?dojo与jquery有什么不同?dojo适合什么开发场景?
首先介绍一下dojo的特性: 1.Dojo是一个符合AMD规范的企业级框架(dojo是一个重量级框架) 2.Dojo全面支持异步加载JS机制(即:支持通过require异步加载JS模块,通过defin ...
- windows手动搭建Kotlin命令行环境
kotlin官网:https://kotlinlang.org 我们可以从GitHub下载.目前最新版本是1.1.2-5 https://github.com/JetBrains/kotlin/rel ...
- gawk的用法
GNU gawk工具的功能是将指定文件中符合指定模式(pattern)的行按指定的动作(action)进行格式化处理 语法:gawk [options] [program] [file-lis ...
- SQL之trigger(触发器)
先来看一小段程序 有如下三张表: 帐户(编号,姓名,余额,建立日期,储蓄所编号) 储蓄所(编号,名称,地址,人数,所属城市) 借贷(帐户,借贷类型,金额,日期) create trigger tri_ ...
- [转] (CQRS)命令和查询责任分离架构模式(二) 之 Command的实现
概述 继续引用上篇文章中的图片(来源于Udi Dahan博客),UI中的写入操作都将被封装为一个命令中,发送给Domain Model来处理. 我们遵循Domain Driven Design的设计思 ...
- CoreLocation 框架
获取设备的地理位置和方向 一.概述 CoreLocation框架,它提供了如下几种服务 确定设备的地理位置 高度 方向 或到附近 iBeacon 的相对位置. 这个框架使用所有可用的车载硬件.如 Wi ...
- Primeton BPS 6.7+MyEclipse_5.5.1GA_E3.2.2插件安装
准备 Primeton_BPS_6.7_Developer MyEclipse5.5插件版 BPS安装 MyEclipse插件安装 点击MyEclipse_5.5.1GA_E3.2.2_Install ...