我想在两行代码之间暂停一下,让我解释一下:
-
用户单击一个按钮(实际上是一张卡片),我通过更改此按钮的背景来显示它:
thisbutton.setBackgroundResource(R.drawable.icon);
-
让我们说1秒后,我需要通过改变它的背景来回到按钮的先前状态:
thisbutton.setBackgroundResource(R.drawable.defaultcard);
-
我试图在这两行代码之间暂停线程:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
但是,这不起作用 . 也许这是我需要暂停的过程而不是线程?
我也尝试过(但它不起作用):
new Reminder(5);
有了这个:
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.format("Time's up!%n");
timer.cancel(); //Terminate the timer thread
}
}
}
如何暂停/休眠线程或进程?
10 回答
该问题的一个解决方案是使用Handler.postDelayed()方法 . 一些Google training materials提出了相同的解决方案 .
但是,有些人已经指出了上面的解决方案,因为它使用了一个非静态的内部和匿名类,它隐式地保存了对其外部类的引用,即活动 . 当活动上下文被垃圾收集时,这是一个问题 .
避免内存泄漏的更复杂的解决方案将
Handler
和Runnable
与活动内部的静态内部类子类化,因为静态内部类不包含对其外部类的隐式引用:请注意,
Runnable
使用WeakReference到Activity,这在需要访问UI的静态类中是必需的 .你可以尝试一下这是 short
WARNING :永远不要在UI线程上执行此操作 .
用它来睡觉,例如 . 背景线程 .
您的问题的完整解决方案将是:这是可用的API 1
没有创建tmp Handler . 此解决方案也优于@tronman,因为我们不会保留Handler的视图 . 我们也没有在坏线程中创建Handler的问题;)
Documentation
View类的postDelayed代码:
我用这个:
你可能不希望这样做 . 通过在按钮单击的事件处理程序中放置一个显式的
sleep()
,您实际上会锁定整个UI一秒钟 . 一种选择是使用某种单发Timer . 创建TimerTask将背景颜色更改回默认颜色,并在计时器上安排它 .另一种可能性是使用Handler . 关于从使用Timer切换到使用Handler的人有a tutorial .
顺便说一下,你不能暂停一个过程 . Java(或Android)进程至少有一个线程,您只能睡眠线程 .
我使用CountDownTime
这就是我在一天结束时所做的 - 现在工作正常:
除了Yankowsky先生的答案,您还可以使用
postDelayed()
. 这可以在任何View
(例如,您的卡)上获得,并且需要Runnable
和延迟期 . 它在延迟之后执行Runnable
.这是我的榜样
创建Java Utils
或者您可以使用:
它的优点是不需要包装
try ... catch
.如果你使用Kotlin和coroutines,你可以做到
如果您需要更新UI