线程和侦听器实例问题

时间:2012-09-17 21:12:57

标签: android

我有一个奇怪的行为与线程和一些`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和线程有关的一个问题,最令人难以置信的问题。

所以这是我的问题:

  • HTC和线程是否存在一些已知问题?
  • 有一些工作吗? (我使用AsyncTask进行调用,直到现在才能完美运行)

事实上,你可以告诉我的任何事情,帮助我了解失败的地方将会非常有帮助,因为它让我发疯。

2 个答案:

答案 0 :(得分:1)

你很幸运它适用于某些手机,因为它没有必要。如果在一个线程上更改clickable字段,则应显式同步另一个线程以查看更改。

尝试制作clickable字段volatile。 Jeremy Manson有一个great article关于volatile和其他优秀的Java并发文章。

我还建议您以其他方式实现您想要的功能 - 只需在第一次单击时禁用该按钮,直到您的Web服务为您提供结果。禁用按钮是向用户发出的明确消息,表示您处理了点击并在禁用时执行了某些操作。

同时检查维基百科上的Happened-before术语。

答案 1 :(得分:0)

只要你在UI线程上运行所有启用/禁用点击功能,这应该可以正常工作。

无论如何,您已经拥有一个名为“setClickable”的内置API函数。你为什么不用它?