Android上的延迟事件

Jef*_*rey 7 android timer

我正在编写一个Android应用程序,可以安排某些方法以不规则的间隔触发.据我所知,至少有两种方法可以做到这一点:

  1. 用于在给定时间后Handler.postDelayed执行a Runnable.

  2. 在给定时间之后使用a Timer来安排和执行a TimerTask.

我正在寻找一种能够快速连续处理多个事件的解决方案.哪种方法最好用?还有一个我错过的更好的吗?

Nic*_* A. 8

简短的回答

它们在后台工作的方式不同,使用错误的方法会产生可怕的后果.

发送到处理程序的所有消息和runnable都在与创建处理程序的线程相同的线程上运行,通常是服务或活动线程.

另一方面,计时器产生一个新线程.

对我来说听起来像Timer是你的选择,但不可能肯定地说出给出的信息.
这一切都归结为如果你想在一个线程或多个线程上运行所有东西,两者都有它的优点和缺点.

答案很长

处理程序

Handler文档:

每个Handler实例都与一个线程和该线程的消息队列相关联.当您创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在消息出来时执行它们队列.

这意味着只有一个事件可以与处理程序同时处理,而所有其他消息/ runnables需要等待另一个事件正在执行.
但是,如果您想要操作UI,则Handler是唯一的方法,因为只允许主UI线程这样做.

如果您不小心,使用处理程序可能会导致应用程序冻结.
一个常见的错误是当人们在主UI线程上创建一个处理程序,产生一堆工作线程并使用处理程序调用繁重的方法时,这将导致主UI线程锁定并使可怕的"应用程序没有响应" android中的对话框

那说处理程序可以很好地处理线程安全,你可以让每个线程都有一个处理所有交叉线程调用的处理程序(使用消息),如果你确保只有处理程序修改一个对象,你将永远不会遇到线程问题.

计时器

但是使用计时器可以获得开销或创建线程以及增加线程的复杂性,在修改共享对象时要小心!

优点是并发性,如果需要同时运行多个任务(或者在非常短的时间间隔内),处理程序可能无法处理它,而计时器则会.

其他选择