2024年4月8日发(作者:)
Android
中有关
Handler
的使用(一)
一个
Handler
允许你发送和处理消息(
Message
)以及与一个线程的消息队列相关的
Runnable
对象。
每个
Handler
实例都和单个线程以及该线程的消息队列有关。当你创建了一个新
Handler
,它就会和创建它的
线程
/
消息队列绑定,在那以后,它就会传递消息以及
runnable
对象给消息队列,然后执行它们。
需要使用
Handler
有两大主要的原因:
(
1
)在将来的某个时间点调度处理消息和
runnable
对象(预约处理对象);
(
2
)将需要执行的操作放到其他线程之中,而不是自己的;
调度处理消息是通过调用
post(Runnable),
postAtTime(Runnable, long),
postDelayed(Runnable, long),
sendEmptyMessage(int),
sendMessage(Message),
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
等方法完成的。其中的
post
版本的方法可以让你将
Ru
nnable
对象放进消息队列;
sendMessage
版本的方法可以让你将一个包含有
bundle
对象的消息对象放进
消息队列,然后交由
handleMessage(Message)
方法处理。(这个需要你复写
Handler
的
handleMe
ssage
方法)
【以上这段翻译自
android sdk
】
Handler
在实际开发中是很常用的,主要是用来接收子线程发送的数据,然后主线程结合此数据来更新界
面
UI
。
Android
应用程序启动时,他会开启一个主线程(也就是
UI
线程),管理界面中的
UI
控件,进行事件派发
,比如说:点击一个按钮,
Android
会分发事件到
Button
上从而来响应你的操作。但是当你需要执行一个比较
耗时的操作的话,例如:进行
IO
操作,网络通信等等,若是执行时间超过
5s
,那么
Android
会弹出一个
“
经典
”
的
ANR
无响应对话框,然后提示按
“Force”
或是
“Wait”
。解决此类问题的方法就是:我们把一些耗时
的操作放子线程中去执行。但因为子线程涉及到
UI
更新,而
Android
主线程是线程不安全的,所以更新
UI
的操
作只能放在主线程中执行,若是放在子线程中执行的话很会出问题。所以这时就需要一种机制:主线程可以发送
“
命令
/
任务
”
给子线程执行,然后子线程反馈执行结果;
!你必需要知道的:
若在主线程中实例化一个
Handler
对象,例如:
Handler mHandler = new Handler();
此时它并没有新派生一个线程来执行此
Handler
,而是将此
Handler
附加在主线程上,故此时若你在
Han
dler
中执行耗时操作的话,还是会弹出
ANR
对话框!


发布评论