handle()

来源:互联网 发布:mac itunes 怎么登陆 编辑:程序博客网 时间:2024/06/09 18:59

Handler的定义:

  * 主要接受子线程发送的数据, 并用此数据配合主线程更新UI。当应用程序启动时,

  * Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说,

  * 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。

  * 如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,

  * 如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭"。

  * 这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,

  * 也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。这个时候,Handler就出现了,来解决这个复杂的问题 ,

  * 由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,

  * 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。

  * Handler一些特点:

  * Handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),

  * 它有两个作用: (1): 安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行

  * Handler中分发消息的一些方法

  * post(Runnable)

  * postAtTime(Runnable,long)

  * postDelayed(Runnable,long)

  * sendEmptyMessage(int)

  * sendMessage(Message)

  * sendMessageAtTime(Message,long)

  * sendMessageDelayed(Message,long)

  * 以上post类方法允许你排列一个Runnable对象到主线程队列中,当需要在不同于主UI线程中执行则需要配合HandlerThread进行使用:

  * HandlerThread handlerThread = new HandlerThread("myHandlerThread");

  * handlerThread.start();

  * handler = new Handler(handlerThread.getLooper());* sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.


Handler的用途:


     通过上一小节对Handler的一个初步认识后,我们可以很容易总结出Handler的主要用途,下面是Android官网总结的关于Handler类的两个主要用途:
(1)线程间的通信
在执行较为耗时的操作时,Handler负责将子线程中执行的操作的结果传递到UI线程,然后UI线程再根据传递过来的结果进行相关UI元素的更新。(上面已有说明)
(2)执行定时任务
指定任务时间,在某个具体时间或某个时间段后执行特定的任务操作,例如使用Handler提供的postDelayed(Runnable r,long delayMillis)方法指定在多久后执行某项操作,比如当当、淘宝、京东和微信等手机客户端的开启界面功能,都是通过Handler定时任务来完成的。


Handler的使用实例


      上面我们学习Handler概念时讲了Handler和Looper是属于线程内部的数据,意思就是说每一个实例化的Handler和Looper的对象都是依附于一个线程,这里称为宿主线程。我们知道, Android应用程序是通过消息来驱动的,系统为每一个应用程序维护一个消息队列,应用程序的主线程不断地从这个消息队例中获取消息(Looper),然后对这些消息进行处理(Handler),这样就实现了通过消息来驱动应用程序的执行。我们在启动应用程序时,系统会自动为UI线程创建Looper对象和MessageQueue,用于接受、管理和分发不同消息。而对于其它非UI线程来讲,就必须要手动创建了。
废话不多说,先来总结一下使用Handler实现异步消息处理的编程步骤,一般分为如下6个步骤:
    (1)调用Looper.prepare()方法,实例化Looper和MessageQueue对象;(系统自动主线程创建,此步骤省略)
    (2)实例化Handler对象,并重写对象中的handleMessage()方法,用于处理Looper对象分发过来的消息;
    (3)实例化Message对象,并将需要传递的结果对象添加到Message对象中;
    (4)调用目标Handler对象的sendMessage(Object obj)等方法,将Message传递到MessageQueue中;
    (5)调用Looper.loop()方法,启动消息循环管理;(UI线程会自动自动启动loop()方法,此步骤省略)
    (6)在handleMessage()中接收Looper对象分发过来的消息(Message),并执行相关操作UI线程更新等操作。


我们下面来做几个实验,通过在不同线程中创建Looper和Handler,然后利用它们来实现异步消息的处理,看一下运行的结果,以便我们在后面的学习中更好地理解异步任务消息处理机制的实现原理。我们将做如下几个实例:
    (1)在主线程中创建Handler和Looper对象,并使用它们执行异步任务的操作;
    (2)在子线程中创建Handler对象,在主线程创建Looper,并使用它们执行异步任务的操作;
    (3)在子线程中创建Handler和Looper对象,并使用它们执行异步任务的操作;
    (4)使用Handler对象的定时任务的功能实现APP首页欢迎界面的功能。

0 0
原创粉丝点击