【发布时间】:2012-12-06 15:49:41
【问题描述】:
在我面向 Android 4.0.3 的应用中,我曾经有一个 Button 作为 Switch。单击按钮正在更改其资源(在播放/暂停之间切换),并且一些任务正在后台执行。特殊之处在于,当按下按钮时,我希望切换开关在短时间内不可用(以防止快速切换)。
为此,我创建了一个等待 X 秒的线程,如下所示:
void blockButton(){
new Thread() {
public void run(){
try {
synchronized(this){
button_ready = false;
sleep(5000);
button_ready = true;
}
}
catch(InterruptedException ex){}
}
}.start();
}
}
基本上在我的 Activity/onClickListener 中
if(button_ready){
// Start background stuff
changeButtonResource();
button.setEnabled(false);
blockButton();
button.setEnabled(true);
}
到目前为止一切顺利,一切顺利。但我最终希望将其更新为 Switch。代码几乎相同(除了 onClickListener 变成了 OnCheckedChangeListener)。
但是现在,当我单击一次按钮时,再次单击将允许更改其资源 - 但后台任务将无法启动(我已经使用振动器和其他人尝试过,它只会更改资源)。
所以我几乎拥有了我的 Button 曾经的行为,但是资源变得混乱了。任何想法都会受到欢迎!谢谢。
【问题讨论】:
-
您的同步块不做任何事情(
this指的是线程,它是一个局部变量,因此不共享)。button_ready是如何声明的?volatile? -
button_ready 是类中的常规变量,并在 onCreate() 方法中初始化。该方法再次与一个简单的 Button 完美配合,因此线程确实做了一些事情(更改 var、等待、更改 var)。
-
为了使您的代码线程安全(这可能会或可能不会解决问题):删除同步块并将您的变量声明为易失性:
private volatile boolean button_ready;。 -
感谢您的提示(虽然没有解决问题)
标签: android multithreading layout button toggle