我有一个奇怪的行为与线程和一些`onclick侦听器实例在一些手机(奇怪,它不是由Android版本,测试它在GalaxyII与Android 4.03和工作,在Samsumg Galaxy Tab 3.2工程正常并且在HTC EVO Design 4G中安装了android 4.03和HTC EVO 4G以及android 2.3.3不起作用)所以这就是问题所在:
我有一个异步类调用Web服务并阻塞屏幕直到服务完成,然后线程通知UI服务调用已完成,因此UI显示模式屏幕,使addView(GenerateView)
成为活动。这工作正常,直到我需要避免触发操作的按钮中的多次单击,因为多个视图正在添加到活动。所以我实现了这样的自定义OnClickListener
:
public abstract class OnOneClickListener implements OnClickListener {
private boolean clickable;
public OnOneClickListener(){
clickable = true;
}
public final void onClick(View v) {
if (clickable) {
clickable = false;
onOneClick(v);
}
}
public abstract void onOneClick(View v);
public void reset() {
clickable = true;
}
}
所以我实现自定义onclick
,阻止按钮的可点击性,调用Web服务,当它完成创建的函数并返回视图以添加到活动时,模式窗口调用{{ 1}}并再次允许点击按钮。该函数通过参数接收类的实例。这就像之前提到的手机中的魅力,但在我调试的HTC中可以看到reset()
函数修改了可点击变量而OnOneClickListener()
函数没有看到它!并且它也以其他方式发生,就像在类的两个不同实例中调用函数而不是!这只是我与HTC和线程有关的一个问题,最令人难以置信的问题。
所以这是我的问题:
事实上,你可以告诉我的任何事情,帮助我了解失败的地方将会非常有帮助,因为它让我发疯。
答案 0 :(得分:1)
你很幸运它适用于某些手机,因为它没有必要。如果在一个线程上更改clickable
字段,则应显式同步另一个线程以查看更改。
尝试制作clickable
字段volatile
。 Jeremy Manson有一个great article关于volatile
和其他优秀的Java并发文章。
我还建议您以其他方式实现您想要的功能 - 只需在第一次单击时禁用该按钮,直到您的Web服务为您提供结果。禁用按钮是向用户发出的明确消息,表示您处理了点击并在禁用时执行了某些操作。
同时检查维基百科上的Happened-before术语。
答案 1 :(得分:0)
只要你在UI线程上运行所有启用/禁用点击功能,这应该可以正常工作。
无论如何,您已经拥有一个名为“setClickable”的内置API函数。你为什么不用它?