安卓定时器类Timer与消息处理类Handler

来源:互联网 发布:阿里云华南1是哪里 编辑:程序博客网 时间:2024/06/12 01:26


安卓串口编程中,需要循环判断串口中是否有数据到来,如果有数据到来,则接收数据。可以通过定时器类Timer和消息处理类Handler来实现以上功能。

1 定时器类Timer

Timer表示定时器类,该类可以为后台进程安排要执行的任务。每个Timer对象相对应一个后台线程,用于顺序地执行任务。

1.1 创建定时器类对象

onCreate()方法中通过new创建Timer类的对象。

Timer timer = new Timer();

1.2 定义定时器任务类对象

TimerTask表示定时器任务类,该类的全称是java.util.TimerTask。该类包含一个抽象的方法run(),该方法即为定时器指定的任务。在定义该类的对象时必须重写run()方法。

MainActivity类添加一个访问权限是private的成员变量,该变量的类型是TimerTask

private TimerTask timerTask = new TimerTask(){@Overridepublic void run(){Message msg = new Message();msg.what = 1;myHandler.sendMessage(msg);}};
其中,在重写的run()方法中,向主线程发送消息,主线程收到消息之后进行后续处理。myHandler是消息处理类Handler的对象,该消息处理类在“2消息处理类Handler”中详细介绍。

1.3 启动定时器

通过定时器类Timerschedule()方法启动定时器。该方法的格式之一为

public void schedule(TimerTask task, long delay, long period);
其中,参数task是定时器的任务;delay指定了在执行任务前要等待的时间;period指定了执行任务的周期。

onCreate()方法中启动定时器。

timer.schedule(timerTask, 0, 500);
其中,timer是在“1.1创建定时器类对象”中创建的定时器类对象;timerTask是在“1.2定义定时器任务类对象”中定义的定时器任务类的对象。以上代码的作用是启动了一个定时器,该定时器每隔0.5秒就向主线程发送消息。

2 消息处理类Handler

1定时器类Timer”中提到,定时器每隔0.5秒就向主线程发送消息,该消息被放到程序的消息队列中,消息处理类从消息队列中取出消息并进行处理。

2.1 消息类Message

1.2定义定时器任务类对象”中已经提到,Message表示消息类。可以通过new关键字创建消息类的对象。该类中的what字段可以保存用户自定义的消息,消息处理类可以通过该字段来判断消息不同的类型并进行不同的处理。在定义了消息对象之后,通过消息处理类Handler的对象myHandler,调用该类的sendMessage()方法,将定义的消息发送给主线程,代码见“1.2定义定时器任务类对象”。

2.2 定义消息处理类的对象

Handler表示消息处理类。在MainActivity类中通过new关键字创建Handler类的对象myHandler。在创建对象时,需要重写Handler类的handleMessage()方法,使用该方法来处理收到的消息。

private Handler myHandler = new Handler(){@Overridepublic void handleMessage(Message msg){switch(msg.what){case 1:               //判断串口中是否有数据到来,如果有数据则接收break;}}};
在以上代码中,通过new关键字创建了Handler类的对象myHandler,该对象即为“1.2定义定时器任务类对象”中提到的变量。重写了handleMessage()方法,在该方法中,对消息类对象msgwhat进行判断,如果该值为1,则说明是“1.2定义定时器任务类对象”中提到的每隔0.5秒就发送一次的消息。收到该消息后,判断串口中是否有数据,如果有数据,则接收。

定时器Timer与消息处理类Handler的关系如图1所示。

 

1 TimerHandler的关系

原创粉丝点击