Android中的Handler(处理程序)

本文详细介绍了Android中的Handler机制,包括其构造、消息创建、插入队列、处理消息以及如何从队列中删除消息。Handler主要用于在特定线程上执行任务和处理数据,通过Looper进行调度。文章还展示了如何跟踪消息队列的处理过程,并提供了相关方法示例。
摘要由CSDN通过智能技术生成

@TOC

From: https://www.tothenew.com/blog/handler-in-android/

android.os.Handler允许我们发送和处理与线程的消息队列(MessageQueue)关联的消息(Message)和Runnable对象。每个Handler实例都与一个线程和该线程的消息(Message)队列关联。

Handler用于:

  • 创建消息(Message)
  • 将消息插入队列 (queue)
  • 在使用者线程上处理消息
  • 管理队列中的消息

Handler的构造

通过使用当前线程的Looper(循环处理器)

new Handler();
new Handler(Handler.Callback)

通过使用显式Looper

new Handler(Looper);
new Handler(Looper, Handler.Callback);

消息创建

有一系列用于创建消息的方法

Message obtainMessage(int what, int arg1, int arg2)
Message obtainMessage()
Message obtainMessage(int what, int arg1, int arg2, Object obj)
Message obtainMessage(int what)
Message obtainMessage(int what, Object obj)

将消息插入队列

将任务添加到消息队列

boolean post(Runnable r)
boolean postAtFrontOfQueue(Runnable r)
boolean postAtTime(Runnable r, Object token, long uptimeMillis)
boolean postAtTime(Runnable r, long uptimeMillis)
boolean postDelayed(Runnable r, long delayMillis)

将数据对象添加到消息队列。

boolean sendMessage(Message msg)
boolean sendMessageAtFrontOfQueue(Message msg)
boolean sendMessageAtTime(Message msg, long uptimeMillis)
boolean sendMessageDelayed(Message msg, long delayMillis)

将简单的数据对象添加到消息队列。

boolean sendEmptyMessage(int what)
boolean sendEmptyMessageAtTime(int what, long uptimeMillis)
boolean sendEmptyMessageDelayed(int what, long delayMillis)

处理消息

消息由Looper分派并传递给Handler。处理程序将收到此消息并进行处理。处理操作是在处理程序所属的使用者线程上完成的。

消息中有两种消息

任务讯息

有可运行对象,没有数据。

handler.post(new Runnable() {
   @Override
   public void run() {
       //TODO : Do some operation
   }
});

数据信息

有数据,不是可运行对象。消息处理在Handler.handleMessage()内部执行。

  final Handler handler = new Handler() {
     @Override
     public void handleMessage(Message message) {
        //TODO : Get the data from Message and perform opertation accordingly.
     }
 };

handler.sendMessage(message);

从队列中删除消息

当我们谈论删除对象时,我们想到的第一件事是它的标识符(identifier)是什么?

讯息识别码

标识符描述适用的消息
Handler消息接收器任务和数据消息
Object消息标签任务和数据消息
整数消息的what参数数据信息
Runnable要执行的任务任务信息

管理队列的方法

从消息队列中删除任务

removeCallbacks(Runnable r)
removeCallbacks(Runnable r, Object token)

从消息队列中删除数据消息

removeMessages(int what)
removeMessages(int what, Object object)

从消息队列中删除任务和数据消息

removeCallbacksAndMessages(Object token)

如何跟踪消息队列处理?

Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, TAG));

让我们看一个跟踪消息的例子

handler.post(new Runnable() {
  @Override
  public void run() {
      Log.d(TAG, "Executing Runnable");
  }
});
mHandler.sendEmptyMessage(111);

此代码的输出是

Dispatching to Handler (android.os.Handler) {8226ef40} 
com.shim.handlertest.activities.HandlerMessageActivity$1@46590829: 0
Executing Runnable
Finished to Handler (android.os.Handler) {8226ef40} 
com.shim.handlertest.activities.HandlerMessageActivity$1@46590829
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值