Android-Handle详解

本文介绍了Android中Handle机制的基本概念及其用法,探讨了Handle如何帮助解决多线程并发问题,更新UI,并分析了Handle、Looper及MessageQueue之间的关系。

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

(学习Mooc的笔记)
转载请标明出处:http://blog.youkuaiyun.com/yuqing_1102/article/details/54972229

1.handle是什么?

handle是android提供用来更新UI的一套机制,也是一套信息处理机制,可以发送消息,也可以通过它处理消息。

2.handle用法

注意:其中Runnable是在UI线程中调用的方法。
   (1)handle.post(Runnable);
   (2)handle.postDelayed(Runnable, long);其中在Runnable中再次postDealyed(Runnable, long),即可循环
   (3)handle.removeCallbacks(Runnable);此方法可停止循环
   (4)handle.sendMessage();
   (5)handle.sendMessageDelayed(long);
   (6)new Handle(Callback);
此方法返回true表示拦截成功,后面的方法不再执行,false表示不加拦截
private Handler myHandler = new Handler(new Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        textView2.setText("update");
        return true; //下面的方法不再执行 
//      return false; //下面的方法继续执行 
    }
}){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        handler.removeCallbacks(myRunnable);
    }
};

……

3.android为什么要设计只能通过handle来更新UI机制

解决多线程并发问题。如果更新UI操作加锁,性能会下降,使用handle更新UI的操作,都是在主线程的消息队列中轮询处理的。

4.handle原理(与Looper,MessageQueue的关系)

handle:封装了消息的发送,主要包括消息发给谁
Looper:内部包含了消息队列MeaageQueue,所有Handle发送的消息都走向MessageQueue,Looper.loop()死循环,负责不断从MessageQueue消息队列中取消息并发送给目标
MessageQueue:消息队列,添加、处理消息

总结:Handle负责发送消息,Looper负责接收Handle发送的消息,并直接把消息回传给Handle本身,MessageQueue就是一个存储消息的容器。

附:ActivityThread:管理应用程序的主线程的执行,在Android系统中,默认情况,一个应用程序的各个组件都会在一个进程(Process)中,是有此进程的主线程负责执行。
ActivityThread和普通的Java类一样,入口是main方法,里面创建了Looper对象(Looper.prepareMainLooper();),在创建Looper过程中,创建了MessageQueue对象。在new Handle()构造方法中,获取到当前线程的Looper对象,即可获取到线程的MessageQueue,这样Handle和Looper/MeaasgeQueue建立了联系,再通过sendEmptyMessage()就可将信息加入消息队列中,然后通过Looper.loop()方法进行轮询取消息(Message msg = queue.next();)并发送给handle本身(msg.target.dispatchMessage(msg);),最后handle在handleMessage(Msg)中处理消息。
如果在子线程中创建handle,需要在new Handle()之前手动使用Looper.prepare();方法,并在handleMessage之后使用Looper.loop();方法进行取信息。

5.子线程更新UI的方法

(1)handle.post(Runnable);
(2)handle.sendMessage();
(3)runOnUiThread(Runnable);
(4)view.post(Runnable);
这四种方法本质都是通过handle机制更新UI的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值