android message 代码,Android Handler移除Message详解及实例代码

Android Handler移除Message详解

问题:

1.removeMessage(what)函数是否只能移除对应what值的Message?

2.对于Delayed发送的Message,能否提前remove?

代码测试:

package javine.k.testhandler;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.HandlerThread;

import android.os.Message;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class TestHandlerActivity extends Activity implements OnClickListener {

private Button startBtn;

private Button endBtn;

public Handler threadHandler; //子线程Handler

private Handler mHandler = new Handler() {

public void handleMessage(android.os.Message msg) {

threadHandler.sendEmptyMessageDelayed(1, 2000);

Log.d("info", "handle main-thread message...");

};

};

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

startBtn = (Button) findViewById(R.id.startButton);

endBtn = (Button) findViewById(R.id.endButton);

startBtn.setOnClickListener(this);

endBtn.setOnClickListener(this);

new Thread(new Runnable() {

@Override

public void run() {

HandlerThread handlerThread = new HandlerThread("handler");

handlerThread.start();

threadHandler = new Handler(handlerThread.getLooper()) {

@Override

public void handleMessage(Message msg) {

//mHandler.sendEmptyMessageDelayed(0, 2000);

            mHandler.sendEmptyMessageDelayed(1, 2000);

Log.d("info", "handle sub-thread message...");}};}}).start();}@Overridepublic void onClick(View v)

{// TODO Auto-generated method stubswitch (v.getId()) {case R.id.startButton:

//开始发送消息mHandler.sendEmptyMessage(1);break;case R.id.endButton:

//移除主线程Handler的消息mHandler.removeMessages(1);break;default:break;}}}

测试结果:

1. removeMassage(1)无法移除what=0的Message。

2. 在子线程中执行完

mHandler.sendEmptyMessageDelayed(1, 2000);

Log.d("info", "handle sub-thread message...");

之后,即可通过removeMesage(1)来移除消息,mHandler将不能接收到该条消息。

源码分析:

1.Android如何移除一条Message?

查看源码可知,Handler.removeMessage(int what)内部调用MessageQueue.removeMessage(this, what, null)

查看MessageQueue的removeMessage方法如下:

void removeMessages(Handler h, int what, Object object) {

if (h == null) {

return;

}

synchronized (this) {

Message p = mMessages;

// Remove all messages at front.

while (p != null && p.target == h && p.what == what

&& (object == null || p.obj == object)) {

Message n = p.next;

mMessages = n;

p.recycle();

p = n;

}

// Remove all messages after front.

while (p != null) {

Message n = p.next;

if (n != null) {

if (n.target == h && n.what == what

&& (object == null || n.obj == object)) {

Message nn = n.next;

n.recycle();

p.next = nn;

continue;

}

}

p = n;

}

}

}

筛选要移除的Message的条件是:target(handler),what,object

该函数分两步来移除Message:

1).移除在前端的符合条件的Message

2).移除后面的符合条件的Message

2.为何延迟发送的Message在延迟时间到达之前就可以被移除?

Handler.sendEmptyMessageDelayed() ---调用---> sendMessageAtTime() -----调用---> enqueueMessage() ----调用MessageQueue.enqueueMessage()

实际进行处理的就是MessageQueue,源码如下:

boolean enqueueMessage(Message msg, long when) {

if (msg.isInUse()) {

throw new AndroidRuntimeException(msg + " This message is already in use.");

}

if (msg.target == null) {

throw new AndroidRuntimeException("Message must have a target.");

}

synchronized (this) {

if (mQuitting) {

RuntimeException e = new RuntimeException(

msg.target + " sending message to a Handler on a dead thread");

Log.w("MessageQueue", e.getMessage(), e);

return false;

}

msg.when = when;

Message p = mMessages;

boolean needWake;

if (p == null || when == 0 || when < p.when) {

// New head, wake up the event queue if blocked.

msg.next = p;

mMessages = msg;

needWake = mBlocked;

} else {

// Inserted within the middle of the queue. Usually we don't have to wake

// up the event queue unless there is a barrier at the head of the queue

// and the message is the earliest asynchronous message in the queue.

needWake = mBlocked && p.target == null && msg.isAsynchronous();

Message prev;

for (;;) {

prev = p;

p = p.next;

if (p == null || when < p.when) {

break;

}

if (needWake && p.isAsynchronous()) {

needWake = false;

}

}

msg.next = p; // invariant: p == prev.next

prev.next = msg;

}

// We can assume mPtr != 0 because mQuitting is false.

if (needWake) {

nativeWake(mPtr);

}

}

return true;

}

由上可知:MessageQueue会对需要延迟发送的Message排序,按照需要延迟的时间长短(when)。

即,虽然是延迟发送的消息,其实当你调用发送函数之后,Message就已经被添加到MessageQueue中去了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中如何调用或修改元组中的元素_python 元组的使用方法

元组——tuple 列表非常适合用于存储在程序运行期间可能变化的数据集。 列表是可以修改的&#xff0c;但元组是不可修改的 Python将不能修改的值称为不可变的&#xff0c;而不可变的列表被称为元组 1. 元组的创建和删除 &#xff08;1&#xff09;使用赋值运算符直接创建元组 语…

【WebRTC---入门篇】(十三)WebRTC音视频数据采集

音视频采集API false表示不采集,true表示采集 WebRTC API适配 获取音视频设备的访问权限 通过 return navigator.mediaDevices.enumerateDevices();/*返回一个promise,为了获取音视频的权限*/ 视频约束

android按钮点击toast,关于button点击事件中setOnClick等元素的解读以及方法?以及toast的位置以及作用?...

此文末参考链接&#xff1a;此段代码的教程以及使用接口的方式、switch语句的教程链接为链接1.汇总里说的有更多的实现方法&#xff0c;为链接2。文中链接为视觉统一&#xff0c;链接均于文末&#xff0c;以上为方便文中跳转&#xff0c;加了文中的跳转链接。以下代码为我学习b…

java用什么编译器_Java用Java编译

java用什么编译器在上一篇文章中&#xff0c;我写了关于如何在运行时生成代理的内容&#xff0c;我们已经了解到生成Java源代码的程度。 但是&#xff0c;要使用该类&#xff0c;必须对其进行编译&#xff0c;并将生成的字节码加载到内存中。 那是“编译”时间。 幸运的是&…

app登录界面背景 css_计算机毕业设计中Java web实现简登录页面(MyBatis+jsp+servlet+html+css+javascript)...

点击上方“蓝字”&#xff0c;关注我们.本文利用MyBatisjspservlethtmlcssjavascript实现了一个简单的登录页面。对用户输入的用户名和密码就行校验&#xff0c;校验通过则登录成功&#xff0c;密码和用户信息保存在mysql表中&#xff0c;通过MyBatis访问(MyBatis相关知识可参考…

android strm,Android 关于so文件的随记

1.背景&#xff1a;项目中要集成商汤的活体检测sdk&#xff0c;2.遇到的问题&#xff1a;商汤提供的demo 可以正常运行&#xff0c;但是将sdk集成至项目中时一直报错&#xff0c;但是商汤侧却没办法提供具体的报错原因3.解决问题&#xff1a;反编译商汤的源码发现&#xff0c;报…

工业互联网二级节点建设_建设者还是二传手?

工业互联网二级节点建设不用说&#xff0c;每个对象都需要先创建才能使用。 无论我们是在谈论域&#xff0c;框架&#xff0c;库还是任何其他类型的类&#xff0c;都没有关系。 当您的代码是面向对象的时&#xff0c;这些类仅是对象的定义。 创建对象之前&#xff0c;不能使用它…

android 指针是什么意思,Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析(3)...

提供引用计数器的类RefBase我们就暂时介绍到这里&#xff0c;后面我们再结合智能指针类一起分析&#xff0c;现在先来看看强指针类和弱指针类的定义。强指针类的定义我们在前面介绍轻量级指针的时候已经见到了&#xff0c;就是sp类了&#xff0c;这里就不再把它的代码列出来了。…

【WebRTC---入门篇】(十五)WebRTC信令服务器实现

如何使用socket.io发送消息 io代表整个节点

气味识别应用_代码气味–第二部分

气味识别应用在上一篇文章《代码气味–第一部分》中 &#xff0c;我谈到了膨胀器&#xff1a;它们是代码气味&#xff0c;可以识别为长方法&#xff0c;大型类&#xff0c;原始痴迷&#xff0c;长参数列表和数据块。 在这一篇中&#xff0c;我想深入研究面向对象的滥用者和变更…

activiti高亮显示图片_如今透明LED显示屏成为广告橱窗,它们之间有什么关联?...

如今我们在街道行走时&#xff0c;我们就会看到各种玻璃橱窗&#xff0c;这是商家想利用橱窗进行不同产品宣传角度。其实无论是海报、灯箱或是实物展示&#xff0c;这些都是商家通过橱窗广告进行来吸引消费者&#xff0c;而现在是5G时代到来使橱窗数字化营销成为了一种新的趋势…

theme editor android,谷歌宣布将于下月停用 Material Theme Editor

使用 Material Theme Editor&#xff0c;开发人员可创建和自定义 Material 主题&#xff0c;包括颜色、形状、版式等等。在 Material Theme Editor 中&#xff0c;可根据不同部分依次选择颜色&#xff0c;并应用于所有组件&#xff0c;还可调整对比度&#xff0c;根据单一颜色自…

【WebRTC---入门篇】(十六)端对端1V1传输基本流程

RTCPeerConnection 媒体协商 setLocalDescription方法 ,收集所有候选者。 setRemoteDescription方法, 放到远端的描述槽中。 协商状态变化

pytorch dataset_【小白学PyTorch】16.TF2读取图片的方法

<>扩展之tensorflow2.0 | 15 TF2实现一个简单的服装分类任务小白学PyTorch | 14 tensorboardX可视化教程小白学PyTorch | 13 EfficientNet详解及PyTorch实现小白学PyTorch | 12 SENet详解及PyTorch实现小白学PyTorch | 11 MobileNet详解及PyTorch实现小白学PyTorch | 10 …

android 硬件对接,Android 对接硬件串口篇

private DispQueueThread DispQueue;private AssistBean AssistData;private SerialControl ComA;Overridepublic void initView() {ComA new SerialControl();//开启串口DispQueue new DispQueueThread();//开启线程实时获取数据DispQueue.start();//线程启动AssistData ge…

【WebRTC---入门篇】(十七)实现1V1音视频实时互动直播系统

STUN/TURN服务器搭建 详细搭建过程 RTCPeerConnection

junit5和junit4_JUnit 5 –架构

junit5和junit4现在我们知道如何设置JUnit 5并使用它编写一些测试 &#xff0c;下面让我们看一下。 在本文中&#xff0c;我们将讨论JUnit 5架构以及采用这种方式的原因。 总览 这篇文章是有关JUnit 5的系列文章的一部分&#xff1a; 建立 基本 建筑 条件 注射 … JUni…

pytorch load state dict_PyTorch 学习笔记(五):Finetune和各层定制学习率

本文截取自《PyTorch 模型训练实用教程》&#xff0c;获取全文pdf请点击&#xff1a;https://github.com/tensor-yu/PyTorch_Tutorial [toc]我们知道一个良好的权值初始化&#xff0c;可以使收敛速度加快&#xff0c;甚至可以获得更好的精度。而在实际应用中&#xff0c;我们通…

华为配备鸿蒙系统的手机,华为P50/新平板双双来袭!全球首发鸿蒙系统:配置都非常强悍...

【12月12日讯】相信大家都知道&#xff0c;华为方面已经正式官宣&#xff0c;将会在12月16日正式推出鸿蒙系统首个手机Bate版本&#xff0c;但也有很多网友们担忧&#xff0c;华为手机在脱离了Android系统以后&#xff0c;鸿蒙OS系统是否真的可以击败Android系统&#xff0c;第…