gpt4 book ai didi

安卓 : Switch (ToggleButton) and threads

转载 作者:行者123 更新时间:2023-11-30 03:53:24 26 4
gpt4 key购买 nike

在我针对 Android 4.0.3 的应用程序中,我曾经将一个按钮用作开关。单击该按钮会更改其资源(在播放/暂停之间切换),并且某些任务会在后台执行。特殊之处在于,当 Button 被按下时,我希望切换器在短时间内不可用(以防止快速切换)。

为此,我创建了一个等待 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 几乎拥有了过去的行为,但资源变得困惑了。任何想法都将非常受欢迎!谢谢。

最佳答案

您不需要创建另一个线程。 View.postDelayed(Runnable) 为您提供了一种在超时后启用按钮(或执行其他 UI 操作)的更简单的方法。您的代码应如下所示:

class ... extends Fragment {
private final Runnable enabler = new Runnable() { public void run() {
button.setEnabled(true);
}};

private View button;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View result = ...
button = result.findViewById(...);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
button.setEnabled(false);
...
}
});
...
}

public void onDestroyView() {
...
button = null;
}

public void onPause() {
...
button.removeCallbacks(enabler);
}

public void onResume() {
...
button.setEnabled(true);
}
}

在您的FragmentActivity 消失之前调用removeCallbacks 对于避免因用户在禁用期间离开而导致的并发问题很重要。在这种情况下禁用回调后,重要的是要确保当用户返回您的 FragmentActivity 时您不会“卡住”在禁用状态> 并且 View 恢复其保存的状态。

关于安卓 : Switch (ToggleButton) and threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13747334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com