Android Handler 用法解析

1.Handler是什么?

Handler是Android提供给我们的一套消息处理机制,主要用来进行异步消息处理和UI更新。

2.为什么要使用Handler?

因为在非UI线程中一般是无法直接更新UI的,当遇到复杂任务的时候,我们不可能在UI线程中等待任务完成,那会造成线程堵塞,另外,通过Handler也可以实现一些特殊的效果,如在不堵塞主线程的情况下定时更新UI。

3.Handler怎么用?

(1)创建UI线程的Handler,使用Runnable对象来完成UI更新

<1>创建Handler对象 Handler handler = new Handler();

<2>创建一个类继承Runnable类并重写run()方法

class MyRunnable extends Runnable{

   public void run() {

       //TODO

}

}

<3>调用post方法发送Runnable对象

    handler.post(new MyRunnable());

(2)创建UI线程的Handler,使用handleMessage(Messagemsg)方法完成UI更新

<1>创建Myhandler类继承Handler类,并实现handleMessage(Message msg)方法

         class Myhandler extends Handler

  {

     @Override

     public void handleMessage(Message msg) {

         // TODO Auto-generated method stub

         super.handleMessage(msg);

     }

  }

    <2>创建MyHandler类的一个实例,MyHandler myHandler=new MyHandler()

    <3>调用任何一种sendMessage(msg)方法,即可实现handleMessage方法回调,Message msg可以是整数,也可以是obj

 

以上两种方法都可以完成UI更新,但是对于一些需要大量时间才能获得数据的操作,如从网络上下载文件,绝对不能让UI线程来完成这件事,这时候,就需要使用子线程来完成任务,并且通知主线程状态,实现线程间通信。

(3)在子线程中完成复杂操作

Handler实际上是一种基于消息队列的机制,而Looper则包含这样一个消息队列,因此,在创建Handler的时候向其传入不同线程的looper则可以实现让handler在不同的线程中执行,looper是在线程中的,因此我们还需要新建一个线程,但是一般的线程是不包含looper的,需要手动设置looper,比较繁琐,因此可以使用HandlerThread轻松创建一个包含looper的Thread。

         <1>创建一个HandlerThread,并且启动这个线程

HandlerThread thread=new HandlerThread();

thread.start();

    <2>获取这个线程的looper

       Looperlooper=thread.getlooper();

    <3>创建一个Handler,并且传入looper

       Handlerhandler=new Handler(looper);

这样,不管是向这个handler发送消息还是Runnable对象,其run()方法的执行都会在子线程中,从而不会影响UI线程。

(4)使用CallBack对象截取handler所接受的信息

         可以向handler中传入一个Callback对象,其中有一个带返回值的handleMessage()方法,当handler接收到消息的时候,会首先执行这个方法,如果其返回值为false则继续执行原本的方法,通过这种方式来截获消息。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值