Android:Button.onClick()并发问题

时间:2013-07-26 11:28:41

标签: android android-button android-scrollbar

我有一个包含四个按钮的Activity,它们在单击时都会触发相同的onClick()方法。我想阻止该方法的并发调用/访问。

  1. 单击button1时,onClick()方法会导致滚动的水平Scrollview滚动几个像素并显示另一个视图。
  2. 这个新显示的视图有一个后退按钮,可以回滚到上一个位置。 [到目前为止,事情正在按预期发挥作用]。
  3. 问题:

    如果在Activity中同时按下两个按钮(或者只相隔几毫秒),那么我的自定义滚动方法会在完成第一个按钮点击执行之前再次调用。

    试过案例

    1. synchronized 关键字与方法一起使用,该方法是通过按钮的onClick和UI线程调用的。 [不工作]
    2. 在onClick()执行期间尝试设置“static boolean flag”, hasClicked 为true,并在onClick()内立即检查它,如果为true则返回。 [不工作]
    3. 相关代码:

          private OnClickListener mClickListener = new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              int viewId = view.getId();
      
              //Proshop top icon
              if(viewId == R.id.proshop_icon){
                  if(hasClicked){
                      return;
                  }
                  hasClicked = true;
                  mProShopIconTop.startAnimation(proShopButtonAnimation());
                  if(mHScrollView.getCurrentChildIndex() == 0){
                      addAndMoveToSecondPage(mProshopPageView, true);
                  } else {
                      addAndMoveToSecondPage(mProshopPageView, false);
                  }
                  hasClicked = false;
              }
              //Tune top icon
              else if(viewId == mTuneIconTop.getId()){
                  if(hasClicked){
                      return;
                  }
                  hasClicked = true;
                  mTuneIconTop.startAnimation(tuneButtonAnimation());
                  if(mHScrollView.getCurrentChildIndex() == 0){
                      addAndMoveToSecondPage(mTunePageView, true);
                  } else {
                      addAndMoveToSecondPage(mTunePageView, false);
                  }
                  hasClicked = false;
              }
              //bottom and top aiConnect button
              else if(viewId == mAiConnect.getId() || viewId == mAiConnectIconTop.getId()){
                  if(hasClicked){
                      return;
                  }
                  hasClicked = true;
                  mAiConnectIconTop.startAnimation(aiConnectButtonAnimation());
                  if(mHScrollView.getCurrentChildIndex() == 0){
                      addAndMoveToSecondPage(mAIConnectPageView, true);
                  } else {
                      addAndMoveToSecondPage(mAIConnectPageView, false);
                  }
                  hasClicked = false;
              }
              //DR page play game button
              else if(viewId == mPlayGame.getId()){
                  if(hasClicked){
                      return;
                  }
                  hasClicked = true;
                  playGolfClick();
                  addAndMoveToSecondPage(mGameMenuPageView, true);
                  hasClicked = false;
              }
          }
      }
      

      这是我从onCLick打来的代码。

      private void addAndMoveToSecondPage(View view, boolean withScroll){
          mHScrollView.removePage(1);
          mHScrollView.addPage(view, 1);
          if(withScroll){
              mHScrollView.moveToNextView();
          }
          view.setVisibility(View.VISIBLE);
      }
      

      mHScrollView 是我自定义的Horizo​​ntalScrollView实例,我将下面的方法合并到我的CustomHorizo​​ntalScrolView中,它是Horizo​​ntalScrolView的子类。

      public void moveToNextView(){
          smoothScrollTo(getScrollX() + mScreenWidth, 0);
      }
      

      任何帮助将不胜感激..提前致谢.. !!

1 个答案:

答案 0 :(得分:2)

您遇到问题的原因不是因为并发(因为两个方法都是在UI线程中按顺序调用),而是因为您的两个动画同时启动。因此,您需要做的是setAnimationListener动画,并禁止点击事件直到onAnimationEnd(Animation animation)未被调用。这样,您在当前时刻只能播放一个动画。