在安卓开发中延时执行可以有以下几个方法:
以定时器的方式实现延时
TimerTask task = newTimerTask(){
public void run(){
//execute the task
}};
Timer timer = new Timer();
timer.schedule(task,delay);
取消的话调用timer.cancel()就能移除任务了
以线程的方式实现延时
new Thread(newRunnable(){
public void run(){
Thread.sleep(XXXX);
handler.sendMessage();//告诉主线程执行任务
}
}).start
安卓中的消息处理方式实现延时
创建一个Handler对象和一个Runnable对象
Handler handler=newHandler();
Runnablerunnable=new Runnable(){
publicvoid run() {//要做的事情,这里再次调用此Runnable对象
handler.postDelayed(this,2000);
}
};
使用PostDelayed方法,指定时间调用此Runnable对象
handler.postDelayed(runnable,2000);
如果想要关闭此定时器,可以这样操作
handler.removeCallbacks(runnable);
removeCallbacks失效的问题
有时候removeCallbacks会失效,不能从消息队列中移除。当Activity进入后台运行后再转入前台运行,removeCallbacks无法将updateThread从message queue中移除。
因为在Activity由前台转后台过程中,线程是一直在运行的,但是当Activity转入前台时会重新定义Runnablerunnable;也就是说此时从message queue移除的runnable与原先加入messagequeue中的runnable并非是同一个对象。如果把runnable定义为静态的则removeCallbacks不会失效,对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,做如下修改就能解决上面的这个问题
static Handler handler = new Handler();
static Runnable runnable = new Runnable()
但也不是所有情况都能定义成静态的。