我正在编写一个Android应用程序,可以安排某些方法以不规则的间隔触发.据我所知,至少有两种方法可以做到这一点:
用于在给定时间后Handler.postDelayed
执行a Runnable
.
在给定时间之后使用a Timer
来安排和执行a TimerTask
.
我正在寻找一种能够快速连续处理多个事件的解决方案.哪种方法最好用?还有一个我错过的更好的吗?
它们在后台工作的方式不同,使用错误的方法会产生可怕的后果.
发送到处理程序的所有消息和runnable都在与创建处理程序的线程相同的线程上运行,通常是服务或活动线程.
另一方面,计时器产生一个新线程.
对我来说听起来像Timer是你的选择,但不可能肯定地说出给出的信息.
这一切都归结为如果你想在一个线程或多个线程上运行所有东西,两者都有它的优点和缺点.
每个Handler实例都与一个线程和该线程的消息队列相关联.当您创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在消息出来时执行它们队列.
这意味着只有一个事件可以与处理程序同时处理,而所有其他消息/ runnables需要等待另一个事件正在执行.
但是,如果您想要操作UI,则Handler是唯一的方法,因为只允许主UI线程这样做.
如果您不小心,使用处理程序可能会导致应用程序冻结.
一个常见的错误是当人们在主UI线程上创建一个处理程序,产生一堆工作线程并使用处理程序调用繁重的方法时,这将导致主UI线程锁定并使可怕的"应用程序没有响应" android中的对话框
那说处理程序可以很好地处理线程安全,你可以让每个线程都有一个处理所有交叉线程调用的处理程序(使用消息),如果你确保只有处理程序修改一个对象,你将永远不会遇到线程问题.
但是使用计时器可以获得开销或创建线程以及增加线程的复杂性,在修改共享对象时要小心!
优点是并发性,如果需要同时运行多个任务(或者在非常短的时间间隔内),处理程序可能无法处理它,而计时器则会.
DelayQueue
AlarmManager
归档时间: |
|
查看次数: |
2795 次 |
最近记录: |