android线程模型剖析之handler

本文详细阐述了Android中Handler的使用方式,包括其用途、时间延迟特性以及如何在多线程环境中有效利用。通过实例代码展示如何创建、配置和发送消息到Handler,以及消息处理流程,帮助开发者掌握Android中消息传递机制的核心。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. handler

1.1 概述

  • 处理对象:handler是用来发送、处理线程中MessageQueue里的消息或者Runnable的对象;
  • 实例特点:一个handler的实例对应于一个线程和该线程的 MessageQueue;
  • 自动绑定:当handler被创建之后,它就自动和创建它的线程和MessageQueue绑定在一起;

1.2  用途

  • 延时处理:将消息或者Runnables放在将来的某个时间点去执行;
  • 多线程间:将排队等候执行的操作放到其它的线程里面去执行。

1.3 说明

  • 时间延迟:我们知道handler处理的操作都是放在一个queue里面的,因此当我们post一个runnable(post(Runnable r))之后,要想很快执行后面的操作则需要等待;

sample:

public class MainAcitivty extends Activity {
    private final static int CMD_MSG = 0;
    private final static String TAG = "TAG";
    private final Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch(msg.what) {
                case CMD_MSG:
                    android.util.Log.d(TAG, "CMD_MSG");
                    break;
            }
        }
    };
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        sendMessage();
    }
    
    private void sendMessage() {
        mHandler.post(new Runnable() {
            
            @Override
            public void run() {
                SystemClock.sleep(5000);
            }
        });
        mHandler.obtainMessage(CMD_MSG).sendToTarget();
    }
}
  • handler数量:一个handler一定对应一个线程,反过来在一个线程里面却可以创建多个handler;

sample:

public class MainAcitivty extends Activity {
    private final static int CMD_MSG = 0;
    private final static String TAG = "TAG";
    private final Handler mHandler1 = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch(msg.what) {
                case CMD_MSG:
                    android.util.Log.d(TAG, "CMD_MSG");
                    break;
            }
        }
    };
    
    private final Handler mHandler2 = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch(msg.what) {
                case CMD_MSG:
                    android.util.Log.d(TAG, "CMD_MSG");
                    break;
            }
        }
    };
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        sendMessage();
    }
    
    private void sendMessage() {
        mHandler1.obtainMessage(CMD_MSG).sendToTarget();
        mHandler2.obtainMessage(CMD_MSG).sendToTarget();
    }

由于一个线程里面只有一个Looper和消息队列,上面的两个handler共享了一个消息队列,但是Message发送的target却不一样,所以2个handler都接受到了消息。

  • handleMessage的调用过程:Looper.loop() -> dispatchMessage -> handleMessage;
     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值