Android之Handler

安卓中的消息循环机制Handler及Looper详解 我们知道安卓中的UI线程不是线程安全的,我们不能在UI线程中进行耗时操作,通常我们的做法是开启一个子线程在子线程中处理耗时操作,但是安卓规定不允许在子线程中进行UI的更新操作,通常我们会通过Handler机制来完成该功能,即当子线程中耗时操作完成后,在子线程中通过Handler向主线程发送消息,在主线程中的Handler的handleMessage方法中处理接受到的消息。这就是安卓中的消息机制,安 阅读详情

handler的基本使用

1.Handler是什么?

    主要是为了接受子线程的消息,配合主线程更新UI。

    在Android系统内,主线程应该专注于更新UI,而不会把精力放到,请求网络,或者本地文件上,从而阻塞自己,使得自己的应用出现anr(application not responding)的情况。

    还有就是Android中Android UI组件是线程不安全的,也就是说,更新UI的操作希望只在主线程中进行,而不希望在子线程中进行,Handler自然而然的就出现了。

2.Handler、Looper、MessageQueue 与 Message

    looper:循环读取消息,交由Handler处理,一个线程对应一个looper
    MessageQueue:消息队列,一个looper对应一个消息队列
    Message:消息,一个消息队列有多个消息
    Handler:处理与分发消息,每个消息最多指定一个handler处理

这里写图片描述

3.handler中的方法

    post系列
    post(Runnable)
    postAtTime(Runnable,long)
    postDelayed(Runnable long)

    Send系列
    sendEmptyMessage(int)
    sendMessage(Message)
    sendMessageAtTime(Message,long)
    sendMessageDelayed(Message,long)

可以看一下post(Runable r)的实现

public final boolean post(Runable r)
{
    return sendMessageDelayed(getPostMessage(r),long)
}

//而getpostMessage则是将runable包装成message
private static Message gerPostMessage(Runnable r)
{
    Message m = Message.obtain();
    m.callback = r;
    return m;
}
在处理message的时候,如果Message.callback不为空则使用这个将优先使用callba来处理
Handle.mcallback不为空则使用mcallback处理
如果前两个都不存在则使用handleMessage处理

4.handler的构造方法

4.1 handler是如何与Looper联系起来的,这个主要在构造方法里面。

4.2 先看一下handler类的成员变量

public class Handler{
    //...部分
    final MessageQueue mQueqe;
    final Looper mLooper;
    //这里就上上述的mcallback
    final CallBack mcallback;

}

4.3Handler 的构造方法

//handler有多个构造方法
public Handler();
public Handler(Callback callback);
public Handler(Looper looper);
public Handler(Callback callback,Looper looper);


//我们来看一个public Handler()
public Handler()
{
    //...部分
    mLooper = Looper.myLooper();//获取当前线程中的Looper实例
    mQueue = Looper.mQueue;
}

//对于下面的例子便是使用了这个构造函数, 并获取了UI主线程的Looper
//对于普通线程来说,我们需要自己开启线程对应的looper
class LooperThread extends Thread
{
    public Handler mHandler;
    public void run()
    {
        //主线程使用Looper.prepareMainLooper()
        Looper.prepare();
        mHandler = new Handler(){ //重写处理消息方法};
        Looper.loop();//进入消息循环
    }
}


5.基本使用

5.1MyThread子线程

package com.example.myhandler;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class MyThread extends Thread{
    private Handler myHandler;

    public MyThread(Handler h) {
        // TODO Auto-generated constructor stub
        this.myHandler = h;
    }

    @Override
    public void run() {
        super.run();
        while(true)
        {
            Message m = new Message();
            m.what = 0x1010;
            Bundle data = new Bundle();
            data.putString("mes", "我是新消息");
            m.setData(data);
            try {
                //睡眠一秒钟
                Thread.sleep(1000);
                //再发送消息
                myHandler.sendMessage(m);
                Log.i("sss", "122212");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

}

5.2.MainActivity

package com.example.myhandler;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    TextView textview;
    Button btn;
    Handler myHandler ;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textview = (TextView)findViewById(R.id.textview);
        btn = (Button)findViewById(R.id.btn);
        myHandler = new Handler(MainActivity.this.getMainLooper())
                {
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        if(msg.what == 0x1010)
                        {
                            textview.append(msg.getData().getString("mes"));
                        }
                    }
                };

        //持有handler的引用可以向他这个线程的looper发送消息
        MyThread tt = new MyThread(myHandler);
        tt.start();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
SAP ABAP实战:用GN_DELIVERY_CREATE批量创建内部交货单的完整代码与避坑指南 本文详细介绍了在SAP ABAP开发中使用GN_DELIVERY_CREATE函数批量创建内部交货单的完整实现方案。通过数据结构设计、多源数据整合、批量处理逻辑和错误处理机制等核心环节的深入解析,帮助开发者高效完成物流单据自动化处理,特别针对VL31N/VL32N等常见场景提供避坑指南。 阅读详情

相关推荐

本地服务器搭建Uptime Kuma网站监控服务

本文主要介绍如何在Linux系统中一键部署Uptime Kuma运维监控服务,并将这个服务映射至公网实现随时随地远程访问。如果您像我一样在服务器上托管了多个网站,并且没有足够的时间来手动检查每个网站的在线状态,那么当出现问题时,您可能无法及时收到通知来处理这些问题。因此,搭建一个在线监控服务是很有必要的,它可以在状态异常时提醒您,以便您能够及时处理问题,确保网站的稳定性和可用性。监控服务有很多,我最终选择了Uptime Kuma,因为Uptime Kuma是开源免费的,

Tiam_cr的博客 1826

Android消息机制

Android消息机制主要指的是Handler的运行机制。 (注意,消息机制中的Handler是android.os包下的Handler,不是java.util.logging包中的Handler,开发中注意不要到错包。) Handler是消息机制的上层接口。Handler将任务切换到handler所在的线程执行。 与handler相关的有MessageQueue、Looper。下面逐步介绍

m00123456789的博客 501

超实用!用ChimeraX对AlphaFold 结果可视化(中): 蛋白结构美化篇

而一般需要的背景颜色是无色(白色),有三种方法可以更改背景颜色,这里我们介绍两种方法,第三种在下一小节中讲解。如果想选中蛋白链中的某一结构区域或者某些位点,可以用Ctrl+Shift+鼠标左键,或在软件窗口中点击。在这个窗口中可以对蛋白的主链、侧链、表面等颜色进行修改,只用在。,即可在右下角看到我们蛋白的序列信息,在这里面直接用鼠标选择要选择的结构域。就会有更多的颜色供我们选择,如果有特定的色号还可以在这个界面继续选择。后面的颜色(②),就可以选择想要的任何背景颜色(③)。就可以选择软件推荐的常用颜色。

m0_63153079的博客 5490

Android开发之handler(一)

先看一下执行结果,只是简单的输出        但是handler到底是何方神圣呢,我们来看一下官方的解释:          A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler ins

亡羊补牢 2488

Apifox CLI + Claude Skills:将接口自动化测试融入ai

基于 Apifox CLI、Claude Code以及Claude Skills组合,实现自然语言触发接口自动化测试。

wwz_0012的博客 599

HFSS实战项目——高带外抑制特性SIW带通滤波器

本文对单级滤波器和双级滤波器的设计、工作原理及仿真结果进行了详细分析,并验证了双级SIW带通滤波器在性能方面的优越性,为微波通信系统中滤波器的设计和应用提供了重要参考。

2401_87464239的博客 1816

handler相关学习(一)手写Android消息机制

Android 的消息机制主要是指Handler得运行机制 以上模型的解释: 1.以Handler的sendMessage方法为例,当发送一个消息后,会将此消息加入消息队列MessageQueue中。 2.Looper负责去遍历消息队列并且将队列中的消息分发给对应的Handler进行处理。 3.在Handler的handleMes...

王温暖的博客 1884

【微服务】Java 对接飞书多维表格使用详解

Java 对接飞书多维表格使用详解

congge_study的博客 1万+

android.os.handler包,【Android】Handler详解

* Handler的定义:* 主要接受子线程发送的数据, 并用此数据配合主线程更新UI。当应用程序启动时,* Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发,比如说,* 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。* 如果此时需要一个耗时的操作,例如:联网读取数据,或者读取本地较大的一个文件的时候...

weixin_29122445的博客 1141

WPS Office JS宏实现文件和数据的上传及下载

WPS Office JS宏下载、上传文件;通过加载项实现数据的获取和上传。

学点笔记 4302

【气候模式降尺度】分位数增量映射(QDM)原理及MATLAB代码实现

简介QDM原理及其MATLAB代码实现

WW、forever的博客 5864

Android :安卓学习笔记之 Handler机制 的简单理解和使用

Android Handler机制的简单理解和使用1、Handler使用引出2、背景和定义3、作用4、相关概念5、工作流程5.1、对应关系6、基本使用7、参考 1、Handler使用引出 现在作为客户,有这样一个需求,当打开Activity界面时,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友可能立马想到如果打开后自动倒计时,就类似于各个APP的欢迎闪屏页面),如下图: 可能觉得直接开启一个包含倒序循环的子线程就ok了,具体实现如下: activity_main <?xml version="

JMW1407的博客 6777

YOLO11涨点优化:半监督学习 | 结合Unbiased Teacher框架,利用海量无标签数据实现自训练暴力涨点

本文提出了一种基于Unbiased Teacher v2的半监督学习方法,用于解决YOLO11目标检测模型在标注数据不足时的性能瓶颈问题。通过分析纯监督YOLO11在小样本场景下的局限性,揭示了朴素自训练方法的三大陷阱:确认偏差、类别不均衡和噪声累积。文章详细解析了Unbiased Teacher框架的核心设计理念,包括教师-学生模型互监督机制、类别平衡损失和Burn-In预热策略,并重点介绍了v2版本针对无锚框检测器的优化。最后提出将Unbiased Teacher与YOLO11相结合的融合架构设计方案,

2601_95807009的博客 209

安卓的Handler机制

Android Handler机制解析 Handler机制是Android实现线程间通信的核心框架,主要由四个关键组件构成: Handler:消息发送和处理的桥梁,负责发送消息(sendMessage)和处理消息(handleMessage) Message:消息数据结构,包含what、obj、arg1/arg2等字段 MessageQueue:消息队列,负责消息的存储和管理 Looper:消息循环,从队列中取出消息并分发 每个线程只能拥有一个Looper,通过ThreadLocal保证线程隔离。使用Han

weixin_44078411的博客 1170

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android基础之Handler分析,vivo安卓开发面试

这个锁,说明的是对所有调用同一个MessageQueue对象的线程来说,他们都是互斥的,然而在我们的Handler里 面,一个线程是对应着一个唯一的Looper对象,而Looper中又只有一个唯一的MessageQueue(这个在上文中也有介绍)。Handler是用于线程间通信的,但是它产生的根本并不只是用于UI处理,而更多的是handler是整个app通信的框架, 大家可以在ActivityThread里面感受到,整个App都是用它来进行线程间的协调。如果频繁的生成对象就会产生内存抖动,也会引发OOM。

m0_57502067的博客 1007

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

安卓Handler

1.什么是Handler? Handler是安卓SDK中处理异步消息的核心类。 Handler的作用是让子线程通过与主线程通信来更新UI界面。 2.Handler的运行机制 创建一个Handler对象,系统就把Handler对象、UI线程和UI线程的消息队列捆绑起来。 当我们在线程处理完数据后,可以通过Handler对象将消息发出。 消息将会会按顺序添加到消息队列中。 UI线程中的L...

qq_41451851的博客 1217

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

安卓中的Handler是怎样的

Handler: 是实现android中不同线程间通信的一种机制,它允许主线程UI线程通过发送message和runable对象到handler,在其handler关联线程中处理这些消息和runnable、 其常用于执行异步任务处理,网络请求/文件读写等,将耗时操作放在单独线程中执行并通过handler进行返回UI主线程,可以避免阻塞UI主线程,提高响应速度。。<<<<////>>>>>Handler: 处理消息的对象,它负责发送和处理消息、sendMessage()/post()

lui0617的博客 861

无法导入android.os.Handler

无法导入android.os.Handler

qq_25592833的博客 1756

安卓handler机制

Handler Android中 ui的更新需要在主线程中进行,一些耗时的操作我们会放在后台线程中进行,而将执行结果在ui线程中进行。 安卓在设计时就封装了一套消息创建,传递,处理机制,如果不遵循这样的机制,就无法更新ui信息,并抛出异常: 不能在非UI线程中去更新UI。 因此就引入了hanlder机制 特点 a. 允许你去发送并处理一条runnable对象和messageQueue相关联的信息。 b. 每一个handler的实例都与一个单独的线程 c. 当创建一个新的处理程序时,它将绑定到正在创建线程的线

weixin_47285644的博客 1109

android.os.handler包,Android Handler机制(不含源码解析,适合新手理解)

一、官方解释A Handler allows you to send and process [Message](https://developer.android.com/reference/android/os/Message.html) and Runnable objects associated with a thread's [MessageQueue](https://develop...

weixin_35815766的博客 1244

【Android】Handler,安卓内存优化管理器

============================================================================= 1. Looper和消息队列机制 Handler持有了一个消息队列MessageQueue对象mQueue。这个对象是Handler实例构造的时候,通过Looper传递过来的。当使用无参构造方法时,这个Looper为Looper.myLooper()。 public Handler() { // 。。。 mLooper = Looper.myLoope

wq221aas的博客 528

Android中Handler简介

1.本文的阅读对象 本文的阅读对象是掌握了一些安卓基础知识的朋友,本文不会涉及源码,也不会有过多代码,对新手比较友好,用简单容易理解的语言描述Handler在安卓开发中的作用 2.Handler是什么? 我们先从字面分析,Handler由英文直译,可以翻译为处理者。在Android中,Handler机制主要用作异步消息处理,这是谷歌设计的一套机制,能帮助我们有序的处理异步操作。 3.And

周敬斌的博客 1240

安卓Handler机制

Handler机制运用在安卓线程之间的消息传递。Handler之所以能够运行,得力于与Handler紧密相联的Looper,每一个线程都只能有一个Looper,一个Looper就可以看成一个事件执行者,Handler决定对事件做什么具体操作,所以一般继承了Handler就要重写其中的handleMessage方法,那么事件从哪里来呢?从消息队列MessageQueue中得来。 Handler的使用...

whoami_I的博客 1550

android handler面试,安卓Handler机制学习笔记附面试问题

基础知识Handler 机制相关的概念包括 Handler、Message 、Message Queue、Looper具体如下图相关的概念核心方法接下来我们将四个相关的类一个个按着源码来看一遍MessageMessage是信息传递的载体里面没有太多逻辑就是包括一些信息传递机制里面必须要用到的属性主要看其构造函数的源码public static Message obtain() {synchroni...

weixin_34835470的博客 166
上一篇: linux下使用python连接redis
下一篇: startActivityForResult的使用
cst_code
博客等级 码龄10年 4粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值