我想知道在一段时间内禁用按钮的最佳方法是什么。当用户使用其他按钮转到其他页面时,定时器不会被重置,按钮仍然会被禁用。
我读过有关异步任务,线程的方法有很多种。但是我不确定哪种方法最好。
我希望计时器在用户选择应用程序中的其他页面时继续运行。如果此人在计时器启动前试图按下计时器,则无法正常工作。
非常感谢,
答案 0 :(得分:1)
我可以看到(从你的评论到其中一个答案)你知道AsyncTask不应该运行很长时间。原因是因为AsyncTasks与活动相关联(因为它通常是活动的内部类)并且持有对它的引用。因为这个Android在运行AsyncTask时不能运行GC,这是Android的一个核心概念。这将导致内存泄漏。有一些解决方法可以避免这种情况,但Android专门为此引入了服务的概念,我将很快解释这一点。
使用线程也不是一个好主意,因为你通常最终会在你需要它们的类中创建线程,因此它拥有对该类的引用而不能是GC' d。当活动的某些长时间运行的任务正在进行并且活动必须位于前台时,线程具有优势。在您的特定情况下,由于您将打开其他几个页面,因此Android会想要GC原始活动 - 从而否定了线程的优势。
服务旨在在后台运行长时间的进程,并在客户端 - 服务器体系结构中表示服务器。该服务可以监视对象的状态,直到服务被终止,这仅在低内存条件下发生。因此,即使按下按钮的活动(或片段)是由GC设置的,您也可以将服务设计为记住剩下的时间,即使原始活动(或片段)的新实例被实例化,该按钮将被启用。
答案 1 :(得分:0)
要安排任务一段时间我使用Timer
类,方法为schedule
new Timer().schedule(new TimerTask()
{
@Override
public void run()
{
// your code here
}
}, 2000 );
在2000毫秒(2秒)之后,将执行方法运行。我希望这个帮助=)
答案 2 :(得分:0)
如果您是线程的初学者,异步任务可以让它变得非常简单。它基本上是一个计时器的包装器,允许您执行“前”和“后”和“期间”活动。一旦您对这个概念感到满意并准备摆脱“绒毛”代码,请转向使用Timers。
答案 3 :(得分:0)
要对UI进行简单更改,请使用Handler。禁用该按钮并将延迟Runnable
发布到处理程序以重新启用它。 AsyncTask
会有点矫枉过正,Timer
会不合适,因为您只应该从UI线程触摸UI。
当用户离开活动时,您需要取消Runnable
任务。为了使用户处于另一个活动时计时器仍在运行,请保存基本状态(即计时器持续时间和开始时间),以便可以再次发布任务(或更新UI以显示它&#39 ; s完成)活动恢复时。请参阅recreating activities上的文档。
编辑:this answer相关问题提供了更多细节。