为了更好的理解Handler的工作原理,先介绍一下与Handler一起工作的几个组件:

  • Message:Handler接受和处理的消息对象
  • Looper:每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的消息,读到信息之后就把消息交给发送该消息的Handler处理
  • MessageQueue:消息队列,它采用先进先出的方式来管理Message。程序创建Looper对象时,会在它的构造器中创建MessageQueue对象

Looper、MessageQueue、Handler各自作用如下:

  • Looper:每个线程只有一个Looper,它负责管理MessageQueue,会不断的从MessageQueue中取出消息,并将消息分给对应的Handler处理
  • MessageQueue:由Looper负责管理。它采用先进先出的方式管理Message
  • Handler:它能把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的消息

在线程中使用Handler的步骤如下:

  1. 调用Loop的prepare()方法为当前线程创建Looper对象,创建Looper对象时,它的构造器会创建与之配套的MessageQueue
  2. 有了Looper后,创建Handler子类的实例,重写handleMessage实例()方法,该方法负责处理来自于其他线程的消息
  3. 调用Looper的loop()方法启动Looper

实例:使用新线程计算质数
MainActivity.java

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.PersistableBundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;import java.util.ArrayList;
import java.util.List;public class MainActivity extends Activity {static final String UPPER_NUM = "upper";EditText etNum;CalThread calThread;class CalThread extends Thread {public Handler mHandler;public void run() {Looper.prepare();mHandler = new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {//super.handleMessage(msg);if (msg.what == 0x123) {int upper = msg.getData().getInt(UPPER_NUM);List<Integer> nums = new ArrayList<Integer>();//计算从2开始,到upper的所有质数outer:for (int i = 2; i <= upper; i++) {for (int j = 2; i <= Math.sqrt(i); j++) {if (i != 2 && i % j == 0) {continue outer;}}nums.add(i);}Toast.makeText(MainActivity.this, nums.toString(), Toast.LENGTH_LONG).show();}}};Looper.loop();}}@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);etNum = findViewById(R.id.etNum);calThread = new CalThread();calThread.start();}public void cal(View v) {Message message = new Message();message.what = 0x123;Bundle bundle = new Bundle();bundle.putInt(UPPER_NUM, Integer.parseInt(etNum.getText().toString()));message.setData(bundle);calThread.mHandler.sendMessage(message);}
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/etNum"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="cal"/></LinearLayout>

Android——Handler、Loop、MessageQueue的工作原理相关推荐

  1. android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)

    关键词: android  camera CMM 模组 camera参数  CAMIF 平台信息: 内核: linux 系统: android 平台:S5PV310(samsung exynos 42 ...

  2. Handler消息传递机制(二)Handler,Loop,Message,MessageQueue的工作原理

    Loop,Message,MessageQueue概念理解: Message:Handler发送.接收和处理的消息对象 Looper:每个线程只能拥有一个Looper.它的looper()方法负责循环 ...

  3. Android开发:图文分析 Handler通信机制 的工作原理

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 下面,将图文详解 Handler机制 的工作原理 目录 1. 定义 一套 Android 消息传递机制 2. 作用 在多线程的 ...

  4. Android学习笔记View的工作原理

    自定义View,也可以称为自定义控件,通过自定义View可以使得控件实现各种定制的效果. 实现自定义View,需要掌握View的底层工作原理,比如View的测量过程.布局流程以及绘制流程,除此之外,还 ...

  5. android 充电模式deamon_Android Lint工作原理剖析

    Android Lint是Android SDK提供的一项静态代码分析工具,对于提高代码质量具有重要作用.到目前为止,Android SDK自带的Lint检查项目达到了253项,我们在开发过程中经常见 ...

  6. Android Handler消息队列的实现原理

    我们在写Android程序的时候,有经常用到Handler来与子线程通信,亦或者是用其来管理程序运行的状态时序.Handler其是由Android提供的一套完善的操作消息队列的API.它既可以运行在主 ...

  7. Android网络框架-Volley(一) 工作原理分析

    使用Volley可以让我们轻松访问网络,不用每次都要写大量重复的代码,而且它是异步的,不用我们再去写异步任务,这样代码非常简洁.还有很重要的一点,他还可以异步加载图片并且有缓存机制,防止OOM发生,V ...

  8. Android系统Recovery工作原理之使用update.zip升级过程分析(四)

    Android系统Recovery模式的工作原理在使用update.zip包升级时怎样从主系统(main system)重启进入Recovery模式,进入Recovery模式后怎样判断做何种操作,以及 ...

  9. Android Handler消息传递机制

    Android中只允许UI线程(也就是主线程)修改Activity里的UI组件.实际开发中,新启动的线程需要周期性地改变界面组件的属性值就需要借助Handler的消息传递机制. Handler类 Ha ...

最新文章

  1. SSH协议、HTTPS中SSL协议的完整交互过程
  2. 清华大学刘知远组:基于Prompt Tuning对低维本征任务子空间进行探索
  3. 嵌入式Linux的Qt
  4. how does SAP ui5 know the phone, tablet type, os type
  5. 注意力机制 神经网络_图注意力网络(GAT)
  6. 联想计算机CDROM启动,联想电脑光驱启动问题?
  7. linux的基础知识——IP,UDP和TCP
  8. Leetcode题目:Valid Anagram
  9. Windows下安装Python_思维导图
  10. jquery for循环_前端基础入门五(掌握jQuery的常用api,实现动态效果)
  11. CSS选择器 ~ +
  12. Java权限管理系统
  13. e580显卡驱动_联想e580网卡驱动下载|联想e580无线网卡驱动官方版_ - 极光下载站...
  14. unity3D人物动画
  15. gcc编译优化-O0 -O1 -O2 -O3 -OS解析
  16. 计算机专业实训图片,实训一图片的简单处理_计算机软件及应用_IT计算机_专业资料...
  17. 《MLB棒球创造营》:走近棒球运动·迈阿密马林鱼队
  18. ChemDraw使用不了怎么办
  19. 同一个人两次被雷电击中,张益唐攻克世纪难题朗道-西格尔零点猜想?
  20. 分享一个优雅的vi配置

热门文章

  1. 第九章:致我们终将逝去的青春(深度优先搜索问题)
  2. change在python是什么函数_python函数基础
  3. 关于单片机对三极管B值的测量
  4. python视频教程推荐it教程网_2019年最新Python黑马头条推荐系统项目开发视频教程完整版...
  5. Java 中的 String、StringBuilder、StringBuffer 的区别
  6. Kali linux 2016.2(Rolling)中的payloads模块详解
  7. Python实现打砖块小游戏
  8. C#网络编程复习资料
  9. 在n个硬币中找出假币
  10. lazarus ui设计_Golang绑定VCL和LCL组件