Java 计时器-异步任务或线程

Java 计时器-异步任务或线程,java,android,timer,Java,Android,Timer,我想知道在一定时间内禁用按钮的最佳方法是什么。当用户使用其他按钮转到其他页面时,计时器不会重置,按钮仍将被禁用 我读过很多关于异步任务、线程的不同方法。然而,我很不确定哪种方法是最好的 我希望计时器在用户选择应用程序中的其他页面时保持运行。如果该人试图在计时器启动前按下计时器,则计时器将无法工作 非常感谢,要将任务安排一段时间,我使用Timer类,方法是schedule new Timer().schedule(new TimerTask() { @Override public

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

我读过很多关于异步任务、线程的不同方法。然而,我很不确定哪种方法是最好的

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


非常感谢,

要将任务安排一段时间,我使用
Timer
类,方法是
schedule

new Timer().schedule(new TimerTask()
{
    @Override
    public void run()
    {
            // your code here
    }
}, 2000 );

2000毫秒(2秒)后,将执行方法run。我希望此帮助=)

如果您是线程方面的初学者,异步任务将使它变得非常简单。它基本上是计时器的包装器,允许您执行“预”和“后”以及“期间”活动。一旦您熟悉了这个概念,并且准备好摆脱“松散”代码,就可以开始使用计时器了

对于UI的简单更改,请使用。禁用该按钮并向处理程序发送延迟的
Runnable
,以重新启用它
AsyncTask
将是多余的,而
Timer
将是不合适的,因为您应该只从UI线程触摸UI

当用户离开活动时,您需要取消
Runnable
任务。要在用户处于另一个活动时显示计时器仍在运行,请保存基本状态(即计时器持续时间和开始时间),以便在活动恢复时再次发布任务(或更新UI以显示任务已完成)。请参阅上的文档

编辑:对一个相关问题的编辑会提供更多的细节。

我可以从您对其中一个答案的评论中看出,您知道AsyncTask不应长时间运行。原因是AsyncTasks绑定到活动(因为它通常是活动的内部类)并持有对它的引用。正因为如此,Android无法在AsyncTask运行时GC活动,这是Android的核心概念之一。这将及时导致内存泄漏。有一些变通方法可以避免这种情况,但Android专门为此引入了服务的概念,我将很快对此进行解释

使用线程也不是一个好主意,因为您通常会在类中创建需要的线程,因此它持有对该类的引用,并且无法GC。当活动的某些长时间运行的任务正在进行且活动必须处于前台时,线程具有优势。在您的特定情况下,由于您将打开其他几个页面,Android将希望GC原始活动-从而否定线程的优势


服务被设计为在后台长时间运行的进程,并在客户机-服务器体系结构中表示服务器。服务可以监视对象的状态,直到服务被终止为止,这仅在内存不足的情况下发生。因此,即使手持按钮的活动(或片段)由Android进行GC,您也可以将服务设计为只记住剩余时间,之后即使实例化了原始活动(或片段)的新实例,按钮也将启用。

谢谢,我知道一旦按下按钮,如何实现计时器。我想知道当一个人打开一个新活动时,如何保持它运行。我希望计时器仍在运行,并且当用户返回计时器时。将有一个视觉显示,听起来更像一个服务(),其他选项可以是广播接收器()。谢谢,这是否适合超过20分钟的计时器?正如我所读到的,异步任务应该用于较小的时间限制。场景是:用户按下按钮,计时器启动。该按钮将被禁用20分钟。例如,如果用户转到应用程序上的信息选项卡,然后返回页面。计时器应该仍在运行,并且为计时器按下的按钮应该被禁用,除非按下第二个按钮停止。谢谢,计时器还需要显示在UI上,因此我不确定是否使用服务。As服务不与用户界面交互。我在哪里可以获得服务实现的示例和服务的阅读材料?最好的文档当然可以在Android开发者网站上找到。您可以在Commnware的Github页面上的cw omnibus标题下找到一些最好的完整项目和代码示例。这里的项目是Murphy由Commonware出版的优秀著作《Android开发繁忙程序员指南》的配套源代码。公共软件的订阅费用大约为每年40美元左右,你可以在这一年内获得该书的每一个版本。这是安卓系统最全面的一本书,也是迄今为止最好的一本。我提供了他们专门在服务项下的项目的链接,但你也应该看看其余的