Handler详解一

Handler机制(一)——Handler运行流程分析 Handler运行机制 阅读详情
<一> Handler的定义: 
           主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 

           解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 
           你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如: 联网读取数据,    或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,,会收到Android系统的一个错误提示  "强制关闭".   这个时候我们需要把这些耗时的操作,放在一个子线程中, 
因为子线程涉及到UI更新,,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了.,来解决这个复杂的问题 , 

     由于Handler运行在主线程中(UI线程中),  它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI. 


<二> Handler一些特点 
         handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程), 
         它有两个作用: (1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行 

        
         Handler中分发消息的一些方法 
         post(Runnable) 
         postAtTime(Runnable,long) 
         postDelayed(Runnable long) 
         sendEmptyMessage(int) 
         sendMessage(Message) 
         sendMessageAtTime(Message,long) 
         sendMessageDelayed(Message,long) 

        以上post类方法允许你排列一个Runnable对象到主线程队列中, 
        sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新. 

<三> Handler实例 
      (1) 子类需要继承Hendler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据 


      以下为一个实例,它实现的功能为 : 通过线程修改界面Button的内容;



      public class MyHandlerActivity extends Activity {
    Button button;
    MyHandler myHandler;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.handlertest);

        button = (Button) findViewById(R.id.button);
        myHandler = new MyHandler();
        // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
        // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象
        // (2): 让一个动作,在不同的线程中执行.

        // 它安排消息,用以下方法
        // post(Runnable)
        // postAtTime(Runnable,long)
        // postDelayed(Runnable,long)
        // sendEmptyMessage(int)
        // sendMessage(Message);
        // sendMessageAtTime(Message,long)
        // sendMessageDelayed(Message,long)
       
        // 以上方法以 post开头的允许你处理Runnable对象
        //sendMessage()允许你处理Message对象(Message里可以包含数据,)

        MyThread m = new MyThread();
        new Thread(m).start();
    }

    /**
     * 接受消息,处理消息 ,此Handler会与当前主线程一块运行
     * */

    class MyHandler extends Handler {
        public MyHandler() {
        }

        public MyHandler(Looper L) {
            super(L);
        }

        // 子类必须重写此方法,接受数据
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            Log.d("MyHandler", "handleMessage......");
            super.handleMessage(msg);
            // 此处可以更新UI
            Bundle b = msg.getData();
            String color = b.getString("color");
            MyHandlerActivity.this.button.append(color);

        }
    }

    class MyThread implements Runnable {
        public void run() {

            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            Log.d("thread.......", "mThread........");
            Message msg = new Message();
            Bundle b = new Bundle();// 存放数据
            b.putString("color", "我的");
            msg.setData(b);

            MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI

        }
    }

}


原文在 这里



一人一猫旅行记之Handler原理 如果在主线程(也叫UI线程)中执行一些耗时操作,会出现ANR问题。为了避免ANR,需要将耗时操作,如网络请求啊、数据库操作啊、读取文件等等的操作,开启一个子线程来处理。 在耗时操作执行完毕后,直接在子线程中更新UI怎么样呢? 一般来说,会出现下面这个错误: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its 阅读详情

相关推荐

Android Handler 机制详解 (一)用法全解

ps:这是关于Android Handler 机制的第一篇文章,主要来说一下Handler的用法,本文尽量归纳完全,如有缺漏,欢迎补充。 Handler的主要作用是切换线程,以及隐式的充当接口回调的作用,当子线程网络请求结束后,通过handler发送消息给主线程,这一点都不多说了。 常用用法 先来贴一种最常用的用法: private Handler mHandler = new Handler...

qq_43747542的博客 703

一切从Android的Handler讲起(一):Handler工作机制

一切从Android的Handler讲起(一):Handler工作机制   有关Handler原理的相关博文或者书本有很多,包括肥柴本人也写过相关的博文,包括基础原理篇:Android基础知识(九):Handler机制的原理分析、基础使用方式篇:Android基础知识(十):Handler的使用方式与注意事项以及原理探究篇:Android进阶知识(二十二):Android的消息机制。   之所以单独开一个篇章来讲讲Handler,原因是肥柴在重看Handler的时候发现如果从Handler出发,可以牵扯的

weixin_38196407的博客 1505

一人公司 CEO × Accio Work:最大能效实战指南

作为一人公司 CEO,你需要同时扮演市场、销售、运营、财务、产品等多个角色。Accio Work 本质上就是你的。

华盛AI的博客 2096

Android中Handler知识(一)

一、Handler 相关知识 1、Handler Looper Message 关系是什么? 首先我们来分析分析一下 Handler 的用法,我们知道,要创建一个 Handler 对象非常的简单明了,直接进行 new 一个对象即可,但是你有没有想过,这里会隐藏着什么注意点呢。现在可以试着写一下下面的一小段代码,然后自己运行看看: public class MainActivity extends ActionBarActivity { private Handler mHand

FrenkX72的博客 175

YOLOv8 轴承缺陷检测 使用YOLOv8进行训练、评估和可视化预测结果 包含1440张图片的轴承缺陷检测数据集 YOLO格式或XML格式

本文介绍了一个基于YOLOv8的轴承缺陷检测项目。数据集包含1440张图片,标注了4类缺陷(凹槽、凹陷、卡伤、划痕),按8:1:1比例划分为训练集(1152张)、验证集(144张)和测试集(144张)。标注文件支持YOLO格式和XML格式,可直接用于模型训练。项目实现了数据准备、模型训练、评估及可视化预测结果的全流程,使用YOLOv8n预训练模型进行50个epoch的训练,并提供了数据格式转换(XML转YOLO)的代码示例。最终模型可自动检测轴承表面缺陷,并保存预测结果。

OICQQ67658008的博客 1438

RK3568—基于GM8775C的MIPI转双通道LVDS屏幕调试

Rockchip RK3568 原生显示接口不支持双通道LVDS屏幕的数据输出,因此需要借助显示转换芯片才能实现双通道LVDS屏幕的驱动。本文介绍使用GM8775C芯片方案,在 RK3568 平台实现单路 MIPI DSI 信号输出来驱动双通道LVDS显示屏。 关于GM8775C GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单/双通道 LVDS功能,MIPI 支持 1/2/3/4 通道可选,每通道最高支持 1Gbps 速率,最大支持 4Gbps 速率。LV.

Industio_优快云的博客 1万+

Android Handler分析(一) Handler和Message详解

Android中的Handler机制分析(一) Handler和Message分析

ITRenj的博客 1469

《QGIS快速入门与应用基础》223:纸张大小与方向(A4/A3/自定义)

本文详细介绍了QGIS布局页面设置的核心操作,重点讲解了纸张大小与方向的设置方法。文章首先指出页面设置是地图排版的基础前提,强调合理设置可避免导出打印时出现尺寸不符等问题。随后详细说明了三种打开页面设置面板的方式,并重点解析了纸张设置的要点:标准预设纸张(A4/A3等)适用于大多数场景,提供国内常用规格对照表;自定义纸张则需谨慎使用,需注意单位选择和尺寸限制。通过界面标注图和操作步骤示意图,帮助用户掌握正确的设置方法,确保最终出图符合规范要求。文章特别提醒新手要优先使用标准预设纸张,避免常见错误,为后续地图

LuckyHanMo的博客 344

Android 封装handler,Handler详解(一)

1、handler是什么?2、为什么要用handler?3、handler怎么用呢?4、android 为什么要设计只能通过handler机制更新UI?5、handler的原理是什么?6、使用handler时候遇到的问题?7、如何实现一个与线程相关的Handler?8、HandlerThread又是什么?9、如何在主线程给子线程发送消息呢?10、android中更新UI的几种方式?11、非UI线程...

weixin_36455339的博客 613

WblockCloneObjects克隆一个图纸内的实体包括块参照,同名块参照的处理

public static void HeBingTu2(double lieJu, List<string> filePaths) { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; using (DocumentLock docLock = doc.Lock...

1108

流体动力学仿真软件:CFX_(10).案例实践:复杂流场分析

在“Phases”选项卡中,定义参与仿真的不同相。例如,如果您要分析气液两相流,可以定义“Air”和“Water”两个相。

kkchenjj的博客 1684

Android Handler的使用(一)

原地址:http://www.eoeandroid.com/thread-72298-1-1.html Handler基本概念: Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。 ...

weixin_30768175的博客 160

多模态目标检测综述介绍及框架提供

多模态目标检测是计算机视觉领域的前沿方向,旨在通过融合不同传感器或数据源的信息(如可见光、红外、深度等),提升复杂场景下目标检测的准确性和鲁棒性。

Limiiiing的博客 4586

Handler 消息机制源码分析(一)

学习Handler 需要掌握ThreadLocal、Linux内核的IO复用 epoll 配合源码一起看更好 一、ActivityThread main方法 Looper初始化 1.Looper.prepareMainLooper 2.Looper.loop方法 loop 方法非常重要 他主要2件事 从MessageQueue.next 读取消息对象 调用Message.target.dispatchMessage 就是handler的dispatchMessage 二、Handler如何存入消

Song的博客 229

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android学习笔记07:Handler的使用一

[Android开发视频教学].01_14_Handler(一)之一 学习使用Handler 这是一个简单的案例,点击开始,下面的数开始自动加一,点击结束,数值恢复为0,可以再点击开始,再次计数 xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:

风达的专栏 1038

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Handler 机制(一)—— Handler的实现流程

由于Android采用的是单线程模式,开发者无法在子线程中更新 UI,所以系统给我提供了 Handler 这个类来实现 UI 更新问题。本贴主要说明 Handler 的工作流程。 1. Handler 的作用 在Android为了保障线程安全,规定只能由主线程来更新UI信息。而在实际开发中,会经常遇到多个子线程都去操作UI信息的情况,那么就会导致UI线程不安全。这时,我们...

Steffen Dinn 的博客 405

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Handler机制分析一

什么是Handler handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一部分在消息队列中逐一将消息取出,然后对消息进行处理。 Handler 简单使用 private Handler handler2 = new Handler() { @Override public void handleM...

吓成一坨兔子 273

android Handler的使用(一)

1/1 android Handler的使用(一) Handler的使用(一) Handler基本概念: Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。

wh123weixiao123的专栏 299

Android Handler : Handler为什么需要是static的 (一)

Android Handler : Handler为什么需要是static的为什么Handler需要是static的先来看一下代码public class HandlerTestActivity extends Activity { private final Handler mHandler = new Handler() { @Override publi

Sunny的小窝 1911

Android Handler类 一看就懂

Android Handler类 一看就懂 一、Handler的定义:           主要接受子线程发送的数据, 并用此数据配合主线程更新UI.           解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button, Android会分发事件到Button上,来

Devin 2161

Android Handler机制(一) 为什么设计Handler

Android Handler机制 google为什么会设计Handler

u012514113的专栏 673

Handler基本使用(一) new Handler

通常我们使用如下方式获取一个Handler对象 private Handler mHandler1 = new Handler(){ public void handleMessage(Message msg) { }; }; private Handler mHandler2 = new Handler(new Handler.Callbac

u011791526的博客 1万+

Handler机制(一)

可以看到主线程是调用Looper.prepareMainLooper()创建了Looper,而且不需要用户手动创建,在Activity启动时就已经创建了,子线程是需要通过prepare()手动创建Looper,并会创建一个MessageQueen能够退出的消息队列。Looper的功能很简单,核心方法Looper.loop()就是不断地从消息队列中分发对应的宿主Handler,它与对应的MessageQueue息息相关,一起创建,一起退出。loop() 方法主要是就是开启死循环,调用loopOnce方法。

一个小菜鸟的成长之路的专栏 402

Handler深入解析(一)

原创不易,转载请注明出处,文章也可能会有修正!

LC1356的专栏 643
上一篇: 定义自己的Adapter 显示想要的组件
下一篇: Handler详解二
慕广陵
博客等级 码龄17年 3粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值