Android | Handler多线程消息传递机制 | Bundle封装数据 | Message消息发送 +Demo

本文详细介绍了Android中的Handler多线程消息传递机制,包括Java Thread多线程、Handler、Message、MessageQueue、Looper的工作原理,并通过倒计时、计时器和获取网页内容的案例展示了Handler的实际应用。同时,文中提到了AtomicBoolean在多线程环境中的作用,以及网络权限的配置。
摘要由CSDN通过智能技术生成

1. Java Thread多线程


Adnroid官方文档

两种方式创建并启动线程

  • 方式一: 继承 java.lang.Thread 并重写run()
class myThread extends Thread{
   
    // 成员变量
    private int num;
    myThread(int num){
   
        this.num = num;
    }
    @Override
    public void run(){
   
        //... 
    }
}
// 启动线程
new myThread(10).start();
  • 方式二:实现 Runnable 接口
class myThread implements Runnable{
   
    private int num;
    myThread(int num){
   
        this.num = num;
    }
    @Override
    public void run(){
   
        //...
    }
}
// 启动线程
new Thread(new myThread(10)).start();

2. Handler


Handler : 线程之间传递消息的即时接口,生产线程和消费线程调用以下操作使用Handler:

  • 在消息队列创建、插入或移除消息
  • 在消费线程中处理消息

每个Handler有一个与之相关的 Looper 和消息队列MessageQueue。

同一线程的多个Handler分享一个同样的消息队列,因为他们分享的Looper对象是同一个。

关于Handler的构造函数官方文档

函数名 描述
Handler() 已弃用
Handler(Handler.Callback callback) 已弃用
Handler(Looper looper) 使用提供的looper对象
Handler(Looper looper, Handler.Callback callback) 使用提供的looper对象和回调接口来处理消息

在构造函数中,looper对象可以通过Looper.myLooper() 创建并获取

3. Message


官方文档

Message 是容纳任意数据的容器,是Handler接收与处理的消息对象。

生产消息发送消息给Handler,Hadnler将消息加入到消息队列中。

该对象提供三种信息,以便Handler和消息队列处理时使用:

  • what 一种标识符,Hander能使用它区分不同消息,从而采取不同的处理方法
  • time 告知消息队列何时处理消息
  • target 表示哪一个Handler 应当处理消息

该对象的创建方式有:

Handler.obtainMessage();	
Handler.obtainMessage(int what);
Handler.obtainMessage(int what, Object obj);
Handler.obtainMessage(int what, int arg1, int arg2);
Handler.obtainMessage(int what, int arg1, int arg2, Object obj);

通过Bundle对象设置消息的数据

public void setData (Bundle data);

4. MessageQueue


官方文档

消息队列(为方便阅读,简写为MQ),以FIFO方式管理所有的Message对象。

是一个LinkedList集合

  • 在初始化Looper对象时会创建一个与之关联的MQ
  • 每个线程最多只有一个MQ
  • MQ通常是由 Looper 管理
  • 主线程创建时,会创建一个默认的Looper对象,从而自动创建一个MQ

5. Looper


官方文档

负责从消息队列MessageQueue中读取消息,然后分发给对应的Handler处理。

每个线程只能管理一个Looper。

使用范例:

 class LooperThread extends Thread {
   
      public Handler mHandler;

      public void run() {
   
          Looper.prepare();

          mHandler = new Handler(Looper.myLooper()) {
   
              public void handleMessage(Message msg) {
   
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
  }

6. AtomicBoolean


作为 java.util.concurrent.atomic 包下的一个类,指原子性的Boolean类型

该类实现的是在多线程环境下,具有排他性,不会被打断,常用方法:

方法名 描述
get() 获取当前的值返回true或false
set(Boolean nueValue) 设置新的布尔值

构造方法:initialValue(Boolean b)

7. Handler使用总结


首先在AppCompatActivity.java类中创建 h a n d l e r handler handler 对象,传入两个参数,第一个是 l o o p e r looper looper,第二个是 C a l l b a c k ( ) Callback() Callback()接口的实现类,

该接口方法实现的是当线程接收到消息 m e s s a g e message message 时做出的响应,在倒计时的案例里就是更新 T e x t V i e w TextView TextView,即显示当前的数字。

综上,Handler作为线程之间传递消息的接口,实现步骤为:

  • App主类负责编写handler对象接收到消息后的处理逻辑
  • 线程类负责存储handler对象,以及在run方法里编写向Handler传递消息的具体实现

Handler传输的消息对象Message里的数据是通过对Java的数据类型或对象进行封装后的Bundle对象来传输的。

8. 案例


8.1 倒计时

import androidx.annotation.NonNull;
import 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值