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

对话框!