Android Handle详解

Android——Handler详解 1. 简介 Handler是一套 Android 消息传递机制 可以说只要有异步线程与主线程通信的地方就一定会有 Handler。 在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理 使用Handler消息传递机制主要是为了多个线程并发更新UI的同时,保证线程安全 2. 相关概念解释 Handler、Message、Message Queue、Looper Android消息机制: 以Handler的sendMes 阅读详情

Android Handle详解

效果图


一.Handle

Handler 为Android操作系统中的线程通信工具,它主要由两个作用:

(1)安排消息或Runnable 在某个主线程中某个地方执行。

(2)安排一个动作在另外的线程中执行。

每个Handler对象维护两个队列(FIFO),消息队列和Thread队列, 都是有Android操作系统提供的。Handler可以通过这两个队列来分别:

发送、接受、处理消息–消息队列;

启动、结束、休眠线程–Thread队列;

Handler的使用方法大体分为3个步骤:

1.创建Handler对象。

2.创建Thread和消息。

3.调用GET以及sendMessage方法将Thread和消息添加到队列。

Handler:
作用:用来满足线程与线程之间的通信
线程一旦被创建就会生成一个Looper对象
每个应用在运行的时候都会生成一个主线程(UI线程)
子线程不能做更新UI的操作,必须要在主线程中完成

Handler:通过Handler对象和Looper进行沟通,以便发送消息到MessageQueue或者接收Looper从MessageQueue中读取的消息

二.代码演示

MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView mTextView;
    private Button mButton1, mButton2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        initView();
    }

    private void initView() {
        mTextView = (TextView) findViewById(R.id.textView);
        mButton1 = (Button) findViewById(R.id.button1);
        mButton2 = (Button) findViewById(R.id.button2);
        mButton1.setOnClickListener(this);
        mButton2.setOnClickListener(this);
    }

    //创建一个Handle
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            String string = null;
            //判断:根据Message的标识判断消息
            if (msg.what == 0) {
                string = (String) msg.obj;
            } else if (msg.what == 1) {
                Bundle bundle = msg.getData();
                string = bundle.getString("bundle");
            }
            mTextView.setText(string);
        }
    };

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
                new Thread() {
                    @Override
                    public void run() {
                        //可以让Message不回收,重复利用
                        Message msg = Message.obtain();
                        //给msg添加标识
                        msg.what = 0;
                        //使用obj给msg传值
                        msg.obj = "按钮一";
                        //设置启动时间
                        mHandler.sendMessageDelayed(msg, 1000);
                    }
                }.start();
                break;
            case R.id.button2:
                new Thread() {
                    @Override
                    public void run() {
                        //相当于New Message,
                        Message msg = Message.obtain();
                        //给msg添加标识
                        msg.what = 1;
                        //创建Bundle对象
                        Bundle bundle = new Bundle();
                        //存放字符串键值对
                        bundle.putString("bundle", "按钮二");
                        //给obtain添加bundle对象
                        msg.setData(bundle);
                        //向消息池中发送消息
                        mHandler.sendMessage(msg);
                    }
                }.start();
                break;
        }
    }
}

XML布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.httpurlconnection.MainActivity">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="55dp"
        android:text="按钮一"/>
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button1"
        android:layout_alignStart="@+id/button1"
        android:layout_below="@+id/button1"
        android:text="按钮二"/>
    <TextView
        android:id="@+id/textView"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button1"
        android:layout_alignParentTop="true"
        android:layout_alignStart="@+id/button1"
        android:text="Hello World!"/>
</RelativeLayout>

Android Handle 机制使用详解 Handle的使用,首先我们要明白一点,那就是Handle的用处,Handle是用来做什么的,明白了这点,那么我在来理解下面的内容。一:接下来我来说明一下Handle的用途Handle到底是什么,我们为什么要来使用Handle,Handle 其实跟Intent有点类似,这里我直说类似,没有说什么是一样的啊,这种话,不是我说的,intent是用来实现四大组件之间的通信用的,而Handle呢?这个它的用 阅读详情

相关推荐

Android中的Handle底层原理

静态内部类则不会持有外部类的引用,Handler对象隐性地持有了Activity的对象,当发生GC是因为 message – handler – acitivity 的引用链导致Activity无法被回收,所以发生了内存泄露的问题。2)、一个Thread只有一个Looper,Looper.prepare()即是建立当前线程、消息队列和Looper的对应关系。2)创建handler对象时,会调用Looper.myLooper()方法,从handler所在线程中获取1中创建的。

sunxingzhesunjinbiao的专栏 702

Android Handle机制以及使用

Handler 是什么??? Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的[函数]即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。 Handler 怎么用??? public class HandlerActivity extends AppCompatActivity { private static final String TAG =

2301_77184740的博客 1096

opencv基础57-模板匹配cv2.matchTemplate()->(目标检测、图像识别、特征提取)

OpenCV 提供了模板匹配(Template Matching)的功能,它允许你在图像中寻找特定模板(小图像)在目标图像中的匹配位置。模板匹配在计算机视觉中用于目标检测、图像识别、特征提取等领域。: 首先,加载目标图像和要匹配的模板图像。: 选择适当的匹配方法,例如 cv2.TM_CCOEFF、cv2.TM_CCOEFF_NORMED、cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_SQDIFF 或 cv2.TM_SQDIFF_NORMED。每种方法对应不同的匹配计算方式。

小海聊智造 1万+

Android之Handle全面理解

一.什么是Handler    Handler是Android给我们提供用来更新UI的一套机制,是一套消息处理机制,可以通过它来发送消息和处理消息。那作为开发者的我们,不禁会疑问?Google为什么要设计这套机制呢?这是为了解决在非UI线程中更新UI组件比较麻烦的问题。那么Android为什么不能在非UI线程中更新呢?首先Android的UI控件不是线程安全的,这是因为避免多线程并发所带来不安全问...

深红骑士的博客 2万+

告别外置天线!手把手教你用HFSS仿真设计一个20x40mm的433MHz PCB蛇形天线

本文详细介绍了如何使用HFSS仿真工具设计一个20x40mm的433MHz PCB蛇形天线,解决物联网设备小型化中的天线集成难题。通过对比外置天线与PCB天线的性能差异,深入解析蛇形天线的电磁学原理,并提供从建模到优化的全流程实战指南,帮助工程师实现高效、低成本的微型化天线设计。

weixin_30606461的博客 430

超级详细的H3C模拟器HCL的交换机Telnet服务配置过程(图文)

VC++2017 MFC关于一个电话机房配线架进线出线节点数据库管理的程序 机房数据库原来是一个EXCEL表,查询,输入数据不方便。现用access数据库ODBC访问。平常没编过程序,编个程序练练手。记录一下学习中的问题,和解决方法,供大家分享,讨论,以便共同进步。希望多提宝贵意见,携手提高代码水平。 程序写的很不规范,代码冗余,显得程序臃肿,代码重用性差。发表这篇博客的目的也是为了改进这个程序。CListCtrl 单元格可以编辑,有Combo Box下拉列表功能。使用PreTranslateMe

techcai的博客 1万+

Android中Handler介绍

首先点击按钮会触发start函数,在start函数中创建了一个子线程,在子线程中创建消息的内容,即在getStringFromNet()中输入字符串,为了看到效果(子线程只执行run()中的代码,外面的代码都在主线程中执行),睡眠了三秒,之后使用sendMessage()将消息发送到Messagequeue中,随后主线程中使用handleMessage()去Messagequeue中取消息,最后将消息显示出来。如果队列中没有同步屏障,则返回队列中的同步消息,并将该同步消息从队列中移除。

sky_1305995351的博客 4038

保姆级教程:用MS建完分子模型,如何一键转成LAMMPS能用的data文件?

本文详细介绍了如何将Materials Studio(MS)构建的分子模型转换为LAMMPS可用的data文件的全流程。重点讲解了力场选择、环境配置、转换命令参数解析及常见问题排查,帮助初学者快速掌握MS与LAMMPS之间的数据转换技巧,特别适合计算材料学领域的研究人员。

weixin_42665255的博客 470

Android——Handler一篇就看懂

Android handler的详细讲解

未来源起的博客 9697

Ubuntu 20.04 系统备份和还原

最近大家Ubuntu开发环境,经常出现搭着搭着系统就挂了,于是开始琢磨了Ubuntu系统的备份和还原,以备不时之需,Linux环境搭建实在是有点太细,好多情况下,就算曾经搭建过一遍,再次搭建有些包还是忘了安装,做好备份是十分必要的。 经过了一番研究,Ubuntu备份有很多方式:根目录tar、dd、Systemback(1.0版本已经不维护了,2.0版本收费)等等,最终决定使用 —— Timesift, 因为方便一些。 文章参考:小马虎的救星——Timeshift Timeshift Timeshift,是L

Z_Paper的博客 2万+

libcrypto.so.10(OPENSSL_1.0.2)(64bit) is needed by erlang-22.0.7-1.el7.x86_64

今天安装Rabbitmq的 erlang-22.0.7-1.el7.x86_64.rpmrpm包时遇到了这个坑,害找到说是不容易;错误信息在下面; [root@iz2zef7u84js1qeeq00ewwz RabbitMQ]# rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm warning: erlang-22.0.7-1.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 6026dfca: NOKEY error:

qq_45782349的博客 5782

浅析Android Handle机制

一.Handle的用例: 1.创建handle实例 new handle(); 2.发送信息载体(Message) sendMessage(msg); 3.处理消息 handleMessage(Message msg){}; 二.原理浅析 结合以上的handle调用三部曲,我们将顺藤摸瓜理清Handle、Looper、Message、MessageQueue的逻辑与关系。

flypu的专栏 1571

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

蚂蚁小兵 2461

Android-Handle详解

(学习Mooc的笔记) 转载请标明出处:1.handle是什么?handle是android提供用来更新UI的一套机制,也是一套信息处理机制,可以发送消息,也可以通过它处理消息。 2.handle用法注意:其中Runnable是在UI线程中调用的方法。 (1)handle.post(Runnable); (2)handle.postDelayed(Runnable, long);其中

yuqing_1102的专栏 3711

第2.0章 机器人C++学习开篇(一):SLAM为什么使用C++语言及学习路线资料推荐

ROS(机器人操作系统):机器人领域的“操作系统”,提供节点通信、参数管理、工具链支持,是SLAM算法在机器人上部署的核心框架。PCL(点云库):处理三维点云数据的利器,包含滤波、分割、配准等算法,是激光SLAM的核心依赖。Eigen(矩阵运算库):高效的矩阵与线性代数运算库,SLAM中的位姿变换、优化求解都依赖它。Ceres/G2O(优化库):SLAM后端优化的“王牌”,Ceres擅长通用非线性优化,G2O则专为图优化设计,二者是BA( bundle adjustment)等算法的实现基础。

行知SLAM 1241

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

安卓Handle的深入剖析和使用

这是一个关于handle的剖析,里面详细的解释了handle的机制,使用就稍微介绍了

Losileeya 4052

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android Handle解析

Handle在android中的意义 Handle通常用来做主线程和子线程之间的通信 Handle 是Android消息机制中的重要一员 只要是有异步线程与主线程通信都得地方就一定有Handle Handle背后通信原理 首先,来创建一个使用Handle的案例 android.os.Handler handler = new Handler(){ @Override public void...

weixin_33682790的博客 124

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android中 关于Handle 的使用及原理

最近在准备面试,在面试过程中,面试官经常会问的一些基础的知识点,如Handle的原理是什么,虽然每次都有认真去看,但是每次回答的时候都感觉 不尽人意。那么Handle 的原理到底是什么呢?使用的场景及相关概念是什么呢?今天我们就来好好分析一下Handle的机制及原理前言     Handle 是Android SDK 提供给开发者进行异步消息处理的类,handle的使用范围不仅仅是去在子线程去更新...

qq_35430159的博客 1406

Android中的Handle的使用与理解

本文主要记录Android开发中Handle的作用 一个应用程序打开时,linux都会为其创建一个进程process,包含了主线程(UI线程),handle的作用主要是 当需要费时间的操作时,可以使界面ui同主线程一起运行,费时间的操作在子线程中运行 接下来用三个例子来使用handle(第三个才是使用handle的好例子) 1. 延迟使用Toast 这个就是单纯的用handle对象把runnable中的东西运行起来 创建handle对象 创建runnable对象 Handler handler_toa

weixin_43737869的博客 2799

Android Handle 源码解析

1.对Handle的认识 Handle机制是一个消息管理机制,Handle在Android的整个系统架构中处于核心的位置。所有的点击事件、滑动事件、页面跳转、服务启动等等,都是Handle消息机制驱动的,线程切换只是Handle的一个附属功能,所以做Android移动端研发必须对Handle机制有深入的理解。 2.Handle消息机制的运转流程分析 2.1消息的发送流程源码分析 //发送消息 public final boolean sendMessage(@NonNull Message m

风的轨迹 521

android handle消息,Android Handle 消息机制

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?handle 消息机制是Android 重要的组成部分,首先我们需要的理解的是Android为什么需要 handle 机制。开发Android的都得知道 Android有主线程之分(UI 线程),主线程中每16ms接收到Android系统的同步信号来更新UI 视图。如果在主线程中进行耗时操作会阻塞线性会造成ANR(无响应...

weixin_39623355的博客 281

安卓——Handle的使用原理理解

原文链接:http://www.2cto.com/kf/201501/368024.html Handle的使用,首先我们要明白一点,那就是Handle的用处,Handle是用来做什么的,明白了这点,那么我在来理解下面的内容。 一:接下来我来说明一下Handle的用途 Handle到底是什么,我们为什么要来使用Handle,Handle 其实跟Intent有点类似,这

Abby同学思考的地方 747

android异步处理,分析Handle消息机制

android异步处理,分析Handle消息机制首先看下handle比较常用的用法 子线程使用主线程的handle发送一条消息到主线程,这个消息会被加到MessageQueue里。 这样就有了loop的概念。looper会不停的从MessageQueue中取消息,发现消息后会调用msg的dispatchMessage方法,就可以在handleMessage的回调中接收到来处理这个消息进行UI操作。

sama_木的博客 1105

Android之Handle的使用原理解析

一,Handle的作用   Handle的作用是什么,其实Handle的作用与intent类似。只不过intent是实现Android四大组件之间的通信,而Handle是实现线程间的通信,例如:当子线程做一个耗时的操作的时候,我们并不知道他什么时候做完,做完了也不知道,那么,我们是不是需要一个东西来通知我们,让我们知道呀,所以说,也就有了Handle的来源,没有Handle这个东西,对我们来说,

zbq1334的博客 908

Android handle简单流程

android

qq_51941912的博客 697

分析Android中Handle机制

上次浅分析了android中的绘画机制,今天我们来谈谈,android中的Handle机制。在一开始学习Android的时候,总会遇见一个问题,更新UI只能在主线程中进行,而有时候做耗时操作(耗时操作要在分线程中进行)后要去更新UI,就不可避免的用到了Handle。例如:class myThread extends Thread{ @Override public void run(

共同交流与成长 507
上一篇: Android Visibility属性详解
下一篇: Android Asytask详解
Android开发-CXY
博客等级 码龄10年 33粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值