使用Handler的大致流程:

1.首先创建一个Handler对象,可以直接使用Handler无参构造函数创建Handler对象,也可以继承Hander类,重写HandleMessage方法来创建Handler对象

2.在监听器中,调用Handler的post方法,将要执行的线程对象加到线程队列当中。此时将会把线程对象添加到handler对象的线程队列中

3.将要执行的操作写在线程对象的run方法中,一般一个Runnable对象,复写其中的run方法就可以了。

Handler包含了两个队列,其中一个是线程队列,另外一个是消息队列。使用post方法会将线程对象放到该handler的线程队列中,使用sendMessage将消息放到消息队列中。

如果想要在这个流程一直执行的话,可以在run方法内部执行postDelayed或者post方法,再将该线程对象添加到消息队列中,重复执行。想要线程停止执行,调用Handler对象的removeCallbacks方法,从线程队列中移除线程对象,是线程停止执行。

Handler为Android提供了一种异步消息处理机制,当向消息队列中发送消息(sendMessage)后就立即返回,而从消息队列中读取消息时会阻塞,其中消息队列中读取消息时会执行Handler中的public void handleMessage方法,因此在创建Handler时,应该使用匿名内部类重写该方法,在该方法中写上读取到消息后的操作,使用Handler的obtainMessage()来获得消息的对象。

Handler与线程的关系:

使用Handler的post方法将Runable对象放到Handler的线程队列中后,该Runnalbe的执行其实并未单独开启线程,而是仍然在当前Activity线程中执行的,Handler只是调用了Runable对象的run方法。

Bundle是什么:

Bundle是一个特殊的map,它是传递信息的工具,它的键只能是string类型,而且值也只能是常见的基本数据类型。

如何让Handler执行Runnable时打开新的线程:

1.首先生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android应用程序架构提供。

HandlerThread handlerThread=new HandlerThread(“handler_thread”);

2.在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();

3.根据这个HandlerThread对象得到其中的Looper对象。

4.创建自定义的继承于Handler类的子类,其中实现一个参数为Looper对象的构造方法,方法内容调用父类的构造函数即可。

5.使用第三步得到的Looper对象创建自定义的Handler子类的对象,再将消息发送到该Handler的消息队列中,Handler复写的handleMessage()将会执行来处理消息队列中的消息。

消息,即Message对象,可以传递一些信息,可以使用arg1,arg2,Object传递一些整形或者对象,还可以使用Message对象的setData(Bundle bundle)来将Bundle对象传递给新创建的线程,新创建的线程在执行handleMessage时可以从message中利用getData()提取出Bundle对象进行处理。

使用Handler的步骤的更多相关文章

  1. 获取内核当前执行模块和当前发生异常地址和线程异常Handler调用步骤

    循环每个内核模块 统计模块大小 判断触发异常的地址属于那个模块.来确定模块 获取发生异常地址 nt!_EXCEPTION_RECORD +0x000 ExceptionCode : -21391605 ...

  2. Android——Handler

    Handler——是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,可以发送也可以处理消息 主要作用:1)在新启动的线程中发送消息:2)在主线程中获取.处理消息. (想想银行取钱 ...

  3. android之Handler机制

    简单例子开头: 网络http请求网站源码数据并显示 注意点:访问网络需要加Internet权限: android.permission.INTERNET 简单的步骤: 使用UrlConnection请 ...

  4. Handler消息传递机制

    引言: 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题. 为了解决这个问题,Android制定了一条简单的规则:只允许UI线程 ...

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

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

  6. Handler消息传递机制——Handler、Loop、MessageQueue的工作原理

    为了更好地理解Handler的工作原理,先介绍一下与Handler一起工作的几个组件. Message:Handler接收和处理的消息对象. Looper:每个线程只能拥有一个Looper.它的loo ...

  7. Android Handler机制剖析

    android的handler机制是android的线程通信的核心机制 Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃. Android中的实现了 接收消息的& ...

  8. Android HttpURLConnection的使用+Handler的原理及典型应用

    1.介绍 总结:HttpURLConnection用来发送和接收数据. 2.ANR异常报错 (1)ANR(Application not response) 应用无响应, 主线程(UI线程) (2)如 ...

  9. .NET MVC执行过程 及 生命周期步骤

    1.网址路由比对 2.执行Controller与Action 3.执行View并返回结果 Request 请求到来 IIS 根据请求特征将处理权移交给 ASP.NET UrlRoutingModule ...

随机推荐

  1. TextBox换行C#文本框换行.net文本框换行textarea换行

    在TextBox中输入的内容,显示的时候如果用lable显示,无法换行 可以使用TextBox输入,然后也使用TextBox 显示,这样换行输入的内容,显示的时候也可以换行.显示的时候可以设置一下控件 ...

  2. 学习LCA( 最近公共祖先·二)

    http://poj.org/problem?id=1986 离线找u,v之间的最小距离(理解推荐) #include<iostream> #include<cstring> ...

  3. Codeforces Round #573 (Div. 1) 差F

    Codeforces Round #573 (Div. 1) E 题意:二维平面上有 n 个点,你可以放至多 m 条直线使得 (0,0) 与每个点的连线至少与一条直线相交.求原点与所有直线的距离最小值 ...

  4. 【lca+输入】Attack on Alpha-Zet

    Attack on Alpha-Zet 题目描述 Space pirate Captain Krys has recently acquired a map of the artificial and ...

  5. MySQL导入及导出数据库

    一.数据库导入 背景:已经从A机器把SQL文件导出,现在需要将sql文件导入B机器(两台机器都是Linux系统) 将sql文件上传到B机器,然后在B机器命令行执行以下命令(不用进入到数据库) 前提是t ...

  6. php先响应后处理

    php响应异步请求或者返回时效要求高的接口中,可以先响应输出,再执行逻辑处理保存数据等任务 ob_end_clean(); ob_start(); echo '{"data":&q ...

  7. 类似postman插件

    Talend API Tester - Free Edition https://chrome.google.com/webstore/detail/talend-api-tester-free-ed ...

  8. mysql,主键与索引的区别和联系

    关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成 ...

  9. rest framework-认证&权限&限制-长期维护

    ###############   自定义token认证    ############### 表 class User(models.Model): name=models.CharField(ma ...

  10. python之os和sys模块的区别

    一.os模块 os模块是Python标准库中提供的与操作系统交互的模块,提供了访问操作系统底层的接口,里面有很多操作系统的函数 1.os常用方法 import os # print(os.getcwd ...