简谈Handler

2024-01-24 17:38
文章标签 handler 简谈

本文主要是介绍简谈Handler,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简谈Handler

为什么要用Handler

Handler作用是处理android的异步消息
因为主线程不能执行耗时程序,这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,而UI更新只能在主线程执行,所以这个时候,Handler就承担着接受子线程传过来的(子线程用sendMessage()方法传弟)Message对象 , 传送给主线程,主线程便会执行更新UI操作,

什么是Handler

handler是Android给我们提供用来处理异步消息的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息

什么是Looper

Looper是一个消息循环,每个线程只有一个Looper,会不断的从MessageQueue取出消息,发送给主线程处理

什么是MessageQueue

MessageQueue是一个消息队列,用来存放子线程发来的消息,再由looper取出发送给主线程处理

Looper和MessageQueue在创建Activity时会自动创建

Handler怎么用

1、创建handler对象:

private  Handler handler = new Handler(){  
2.        @Override  
3.        //书写handleMessage方法,用于第三步接收并处理信息  
4.        public void handleMessage(Message msg) {  
5.            super.handleMessage(msg);  
13.            }  
14.        }  
15.    };

2、发送消息

//创建子线程  
2.new Thread(new Runnable() {  
3.                    @Override  
4.                    public void run() {  
5.                        try {  
6.                            //子线程睡眠5秒  
7.                            Thread.sleep(5000);  
8.                        } catch (InterruptedException e) {  
9.                            e.printStackTrace();  
10.                        }  
11.                        //发送更新UI的信息  
12.                       Message message = handler.obtainMessage();  
13.                        //发送信息的三种方法  
14.                        message.what = 1;      //只能为int型  
15.                        message.a=2;        //只能为int型  
16.                        message.b= 3;  
17.                        message.obj = "准备下载";     //可以是字符串,对象等  
18.                        handler.sendMessage(message);  
19.                    }  
20.                }).start();    //启动线程  

3、接收并处理消息

private  Handler handler = new Handler(){  
2.        @Override  
3.        //书写handleMessage方法,用于第三步接收并处理信息  
4.        public void handleMessage(Message msg) {  
5.            super.handleMessage(msg);  
6.            //这里是发送消息后对消息进行处理  
7.            int a = msg.a;  
8.            int b = msg.b;  
9.            String tip = (String) msg.obj;  
10.            if (msg.what==1){  
11.                //更新UI  
12.                downLoadTip.setText("下载完成"+a+b+tip);  
13.            }  
14.        }  
15.    };

案例解析——倒计时Demo

1.我们通过子线程将结果每隔一秒发送给Handler,由Handler来进行更新UI的操作

new Thread(new Runnable() {  
2.                    @Override  
3.                    public void run() {  
4.                        try {  
5.                            for (int i = count; i >0 ; i--) {  
6.                                //给Handler发送消息  
7.                                handler.sendEmptyMessage(i);  
8.                                //sleep:线程休息的间隔多久    1000毫秒=1秒  
9.                                Thread.sleep(1000);  
10.                            }  
11.                        } catch (InterruptedException e) {  
12.                            e.printStackTrace();  
13.                        }  
14.                    }  
15.                }).start();//start,开启线程  

其中count=10,这里是固定的数值,当然你可以通过EditText由用户输入数据

2.创建出Handler对象,并接收子线程发送过来的消息,然后进行UI的更新

private Handler handler=new Handler(){  
2.        @Override  
3.        public void handleMessage(Message msg) {  
4.            super.handleMessage(msg);  
5.                //msg.what是我们子线程发送过来的消息  
6.                textView.setText(msg.what+""); 
7.
8.        }  
9.    };  

这篇关于简谈Handler的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/640453

相关文章

webservice的安全机制2---handler实现

本节摘要:本节介绍使用handler的方式来实现webservice的IP地址的校验。   1.引言 前一节介绍了使用users.lst文件来实现webservice的用户名和密码的校验, 本节介绍使用webservice的handler来实现webservice的安全校验。 这里,不用用户名和密码来实现安全校验,换一种方式,采用IP地址校验的方式。 这里通过一个配置文件来控制是否打开

Netty源码解析4-Handler综述

Netty中的Handler简介 Handler在Netty中,占据着非常重要的地位。Handler与Servlet中的filter很像,通过Handler可以完成通讯报文的解码编码、拦截指定的报文、 统一对日志错误进行处理、统一对请求进行计数、控制Handler执行与否。一句话,没有它做不到的只有你想不到的 Netty中的所有handler都实现自ChannelHandler接口。按照输入

JAX-WS - Handler详解

一、Handler说明     Handler用于处理Soap消息,如控制Header(如隐式的添加用户信息等)     Handler分成LogicalHandler和SOAPHandler,常用为SOAPHandler;客户端先处理LogicalHeader再处理SOAPHandler,服务器反之 二、开始前的准备     1、服务端         (1)接口: @W

常用的两种handler调用方法

一、Handler、Thread、HandlerThread三者之间的关系如下: 1、Handler:在android中负责发送和处理消息,通过它可以实现其他支线线程与主线程之间的消息通讯。 2、Thread:Java进程中执行运算的最小单位,亦即执行处理机调度的基本单位。某一进程中一路单独运行的程序。 3、HandlerThread:一个继承自Thread的类HandlerThread。

Android消息机制概述 Handler

Android消息机制概述 Android 的消息机制主要是指 Handler 的运行机制, Handler 的运行需要MessageQueue 和 Looper 来支撑。MessageQueue是消息队列,就是内部存储了一组消息,以队列的形式对外提供插入和删除的工作。是采用单链表的数据结构来存储消息列表。Looper是消息循环,由于MessageQueue不能处理消息,然而Looper弥补了这

Handler机制浅析

使用方法 实例化一个handler对象 val handler = object : Handler() {override fun handleMessage(msg: Message) {Log.e(TAG, "收到消息:" + msg.obj.toString())super.handleMessage(msg)}} 在需要发送消息的地方这样调用 val msg = Messag

面试常问Handler 的问题合集

问:Looper.prepare做了什么操作? 检查了当前线程是否已经有了Looper对象,如果已经有了Looper对象,那么就直接报错。保证每个线程只有一个Looper. private static void prepare(boolean quitAllowed) {if (sThreadLocal.get() != null) {throw new RuntimeExcepti

Android源码解析Handler系列第(二)篇--- ThreadLocal详解

在上篇文章Android源码解析Handler系列第(一)篇说了Message的内部维持的全局池机制。这一篇仍然是准备知识,因为在Handler中有ThreadLocal的身影,大家知道,Handler创建的时候会采用当前线程的Looper来构造消息循环系统,那么Handler内部如何获取到当前线程的Looper呢?这就要使用ThreadLocal了,ThreadLocal可以在不同的线程之中互不

Android源码解析Handler系列第(一)篇 --- Message全局池

1、UI不能在子线程中更新是个伪命题 我们常说UI需要在主线程中进行更新,子线程就不能更新UI吗?不是,我们并不是说不能在子线程中更新UI,而是说UI必须要在它的创建线程中进行更新,比如下面一段代码在子线程更新UI就不会报错。 new Thread(new Runnable() {@Overridepublic void run() {TextView textView=new

Android多线程----异步消息处理机制之Handler

一、handler的引入: 我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃。相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创建一个Message对象,然后借助Handler发送出去,之后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作就不会再出现崩溃