计时器 - 异步任务或线程

时间:2014-10-14 19:09:51

标签: java android timer

我想知道在一段时间内禁用按钮的最佳方法是什么。当用户使用其他按钮转到其他页面时,定时器不会被重置,按钮仍然会被禁用。

我读过有关异步任务,线程的方法有很多种。但是我不确定哪种方法最好。

我希望计时器在用户选择应用程序中的其他页面时继续运行。如果此人在计时器启动前试图按下计时器,则无法正常工作。

非常感谢,

4 个答案:

答案 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相关问题提供了更多细节。