0

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

  1. 当 button1 被单击时,onClick() 方法会导致水平滚动的 Scrollview 滚动几个像素并显示另一个视图。
  2. 这个新显示的视图有一个后退按钮,可以滚动回上一个位置。[到目前为止,一切都按预期进行]。

问题:

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

试用案例:

  1. synchronized关键字与方法一起使用,该方法是从按钮的 onClick 与 UI 线程调用的。[不工作]
  2. 尝试在 onClick() 执行期间将“静态布尔标志”设置为 true,并在 onClick() 中立即检查它,如果为 true,则返回。[不工作]

相关代码:

    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​​ntalScrollView 中合并了下面的方法,它是 Horizo​​ntalScrollView 的子类。

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

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

4

1 回答 1

2

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

于 2013-07-26T11:39:01.460 回答