悠悠途恩
通过Handler类,可以提交和处理Message对象和Runnable对象,这里介绍Runnable对象。
Ruannable对象的run方法可以立刻执行某个操作,也可以在指定时间后执行(也可称为预约执行)。
Handler类主要可以使用如下3个方法来设置执行Runnable对象的时间(时间单位是毫秒):
public final boolean post(Runnable r); // 立即执行Runnable对象
public final boolean postAtTime(Runnable r, long uptimeMillis); // 在指定的时间(uptimeMillis)执行Runnable对象
public final boolean postDelayed(Runnable r, long delayMillis); // 在指定的时间间隔(delayMillis)执行Runnable对象
从上面3个方法可以看出,第1个参数的类型都是Runnable,因此,在调用这3个方法之前,需要有一个实现Runnable接口的类,
先看一下,Runnable接口的代码:
public interface Runnable {
public void run(); // 线程要执行的方法
}
可见,在Runnable接口中只有一个run方法,该方法为线程执行方法。如果某个类实现了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信息框。