0

我在某些手机中的线程和`onclick监听器实例有一个奇怪的行为(奇怪的是它不是由android版本,在带有android 4.03的GalaxyII中测试它并且工作,在带有3.2的Samsumg Galaxy Tab中工作正常并且在一个HTC EVO Design 4G with android 4.03 and a HTC EVO 4G with 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;
   }
}

因此,我实现了 custom onclick,阻止了按钮的可点击性,调用了 Web 服务,当它在创建并返回视图的函数中完成时,以模态窗口调用的形式添加到活动中,reset()并允许再次单击按钮。该函数通过参数接收类的实例。这就像前面提到的手机中的魅力,但在 HTC 中,当我调试时可以看到该OnOneClickListener()函数修改了可点击变量并且该reset()函数看不到它!它也以另一种方式发生,比如如果在类的两个不同实例中调用函数并且它不是!这只是我在 HTC 和线程方面遇到的一个问题,最令人难以置信的一个。

所以这是我的问题:

  • HTC 和线程有一些已知问题吗?
  • 有什么解决办法吗??(我正在使用 AsyncTask 进行调用,直到现在它都运行良好)

事实上,你能告诉我的任何能帮助我理解失败在哪里的东西都会非常有帮助,因为它让我发疯。

4

2 回答 2

1

你很幸运,它可以在某些手机上运行,​​因为它不是必须的。如果您更改clickable一个线程上的字段,则应显式同步另一个线程以查看更改。

尝试制作clickable字段volatile。Jeremy Manson 有一篇很棒的关于volatileJava 并发的文章和其他优秀的文章。

I also suggest you to implement what you want the other way - just make the button disabled on first click until your web service gives you a result. Disabled button is a clear message to user that you handled the click and are doing something while it is disabled.

Check also Happened-before term on Wikipedia.

于 2012-09-17T21:51:07.317 回答
0

as long as you run all of the enable/disable of the clicking functionality on the UI thread , this should work fine .

anyway , you already have a built in API function that is called "setClickable" . why won't you use it ?

于 2012-09-17T22:09:02.673 回答