Handler-简介和用法

Handler——简介和用法

  1. Handler中常用的四个方法:
    sendMessage(Message msg)
    sendMessageDelayed(Message msg, long delayMillis)
    post(Runnable r)
    postDelayed(Runnable r, long delayMillis)

    Handler中的message queue和javascript中的event queue的机制是一样的。

  2. handler中post传入的Runnable对象中的run方法其实是在UI线程(主线程)中被执行的,这个就是使用了Handler的第二个作用:将action传入到message queue中,然后使得action被别的线程所执行。

  3. Handler handler = new Handler(); // 创建Handler对象
    通过Handler在自定义的子线程中更新UI,否则会抛出异常的。

  4. 我们可以自己在UI线程之上再创建线程,然后我们需要通过Handler来使得我们的线程和UI线程通信。这样我们才能在我们的子线程中更新UI。因为Android中UI的更新只能在UI线程中进行。我们只能通过Handler的通信来使得我们从子线程中更新UI。

  5. 从上面的介绍我们知道,一个Handler实例其实绑定了一个关联的thread线程和那个线程的message queue;handler会讲message和runnable对象发送到它所关联的message queue中去,同时它也会执行从message queue中出来的message和runnable。

  6. Handler的两大用途:1. 在未来某个时间点执行message和runnable对象;2. 将要执行的action放到message queue中去,然后使得另外的不同的线程可以执行这个action。

  7. 使用Handler的sendMessage()和handleMessage()

    • handleMessage()
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
mTextView.setText("" + msg.arg1);
};
};

主线程中新建一个Thread发送message给主线程。

new Thread() {
public void run() {
Message message = handler.obtainMessage();
message.arg1 = 88;
handler.sendMessage(message);
};
}.start();
  1. 移除runnable对象
    对应于handler.postDelayed(myRunnable, 2000);
    直接handler.removeCallbacks(myRunnable);
  2. 截获message
    在创建handler对象时,调用new Handler(Callback callback)方法。
private Handler handler = new Handler(new Callback() {
public boolean handleMessage(Message msg) {
return true; //return true就截获,return false不截获
}
}){
public void handleMessage(Message msg) {
}
};

在主线程中执行handler.sendEmptyMessage(1)。其原理:
当Handler收到message时,新创建的Callback将首先执行,其handleMessage()将会处理消息;如果Callback的handleMessage()不截获消息,然后Handler才可能会收到消息。Handler的Callback用法。如果return true,则说明message被截获,下面的handleMesage方法将不会被执行。

1、使用Handler在子线程中向ui线程发送一个消息进行UI的更新;
2、创建一个Message; Message msg = new Message(); msg.arg1=88;
3、handler.sendMessage(msg); // 最终导致同一个handler对象的handleMessage()方法被创建Handler对象的线程(一般在主线程中创建)回调,然会这个传入的msg会被当成参数传给handleMessage()方法的。这个时候我们就可以对Message对象做一些处理了,而且这个时候我们所处的线程一般就在UI线程中了,所以这个时候我们更新UI就没有问题了。

msg.obj=xxx; 可以传递一个对象;

4、复用系统的message对象 Message msg = handler.obtainMessage(); // or Message.obtain();
msg.sendtoTarget(); 也可以发送到Handler对Message进行处理
handler.removeCallbacks(Runnable r);

如前面所说,我们除了在Handler对象的handleMessage()方法中处理Message对象,还可以在Handler对象创建的时候传入一个Callback对象,用这个Callback对象来处理Message对象;注意:callback接口中handleMessage(Message msg)中若截获则一定返回true;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值