8.3.2 预约时间Handler
本节的例子代码所在的工程目录是src\ch08\ch08_handler
android.os.Handler是Android SDK中处理定时操作的核心类。通过Handler类,可以提交和处理一个Runnable对象。这个对象的run方法可以立刻执行,也可以在指定时间后执行(也可称为预约执行)。
Handler类主要可以使用如下3个方法来设置执行Runnable对象的时间:
- // 立即执行Runnable对象
- public final boolean post(Runnable r);
- // 在指定的时间(uptimeMillis)执行Runnable对象
- public final boolean postAtTime(Runnable r, long uptimeMillis);
- // 在指定的时间间隔(delayMillis)执行Runnable对象
- public final boolean postDelayed(Runnable r, long delayMillis);
从上面3个方法可以看出,第1个参数的类型都是Runnable,因此,在调用这3个方法之前,需要有一个实现Runnable接口的类,Runnable接口的代码如下:
- public interface Runnable
- {
- public void run(); // 线程要执行的方法
- }
在Runnable接口中只有一个run方法,该方法为线程执行方法。在本例中Main类实现了Runnable接口。可以使用如下代码指定在5秒后调用run方法:
- Handler handler = new Handler();
- handler.postDelayed(this, 5000);
如果想在5秒内停止计时,可以使用如下代码:
- handler.removeCallbacks(this);
除此之外,还可以使用postAtTime方法指定未来的某一个精确时间来执行Runnable对象,代码如下:
- Handler handler = new Handler();
- handler.postAtTime(new RunToast(this)
- {
- }, android.os.SystemClock.uptimeMillis() + 15 *
1000); // 在15秒后执行Runnable对象
其中RunToast是一个实现Runnable接口的类,代码如下:
- class RunToast implements Runnable
- {
- private Context context;
- public RunToast(Context context)
- {
- this.context = context;
- }
- @Override
- public void run()
- {
- Toast.makeText(context, "15秒后显
示Toast提示信息", Toast.LENGTH_LONG).show();- }
- }
postAtTime的第2个参数表示一个精确时间的毫秒数,如果从当前时间算起,需要使用android.os.SystemClock.uptimeMillis()获得基准时间。
要注意的是,不管使用哪个方法来执行Runnable对象,都只能运行一次。如果想循环执行,必须在执行完后再次调用post、postAtTime或postDelayed方法。例如,在Main类的run方法中再次调用了postDelayed方法,代码如下:
- public void run()
- {
- tvCount.setText("Count:" + String.valueOf(++count));
- // 再次调用postDelayed方法,5秒后run方法仍被
调用,然后再一次调用postDelayed方法,这样就形成了- // 循环调用
- handler.postDelayed(this, 5000);
- }
运行本例后,单击【开始计数】按钮,5秒后,会在按钮上方显示计数信息。然后单击【15秒后显示Toast信息框】按钮,过15秒后,会显示一个Toast信息框,如图8.17所
联系客服