【问题标题】:Inconsistent behavior/performance of Gradle/Android Studio especially with bool variablesGradle/Android Studio 的行为/性能不一致,尤其是布尔变量
【发布时间】:2021-08-31 06:04:29
【问题描述】:

我正在开发一款模拟板球比赛的应用。我的逻辑是正确的,但由于未反映更改,程序不断给出错误的输出。我使缓存无效并重新启动了 android studio。但是,不反映变化的故障仍在继续。这些变化与布尔变量特别相关。两天后突然我运行了该应用程序,它的行为符合预期。 我很困惑 Gradle 构建系统是否有任何故障?所有这些混乱都占用了我很多时间。我正在考虑切换到其他一些android IDE。哪个更好并且不使用 Gradle?因为我对 Android Studio 和 Gradle 感到沮丧。我并不是要散布对 Android Studio 和 Gradle 的仇恨,但我对性能和不一致感到非常沮丧。

编辑: 我有一个名为 Team 的类,它有两个 bool 变量,指示一个团队是 batting 还是 bowling

代码如下:

public class Team {

private int numberOfRunsScored, numberOfWicketsTaken;
private int numberOfBallsThrown, numberOfOversCompleted;
private String inningTypeString;
private boolean batting,balling;

public boolean isBatting() {
    return batting;
}

public void setBatting(boolean batting) {
    this.batting = batting;
}

public boolean isBalling() {
    return balling;
}

public void setBalling(boolean balling) {
    this.balling = balling;
}

在 MainActivity 中模拟游戏,我制作了 class Team 的两个对象分别为 "a""b"。 比赛开始时,随机结果决定哪支球队先击球,哪支球队打拳。 因此,对于第一局,我将行为设置如下:

`public void performToss() {
    tossCallByTeamA = a.tossCall();
    tossOutput.setTossOutcome(tossOutput.doToss());
    boolean tossOutCome = tossOutput.getTossOutcome();
    if (tossOutCome == tossCallByTeamA) {
        a.setInningType(Team.InningType.BATTING);
        b.setInningType(Team.InningType.BOWLING);
        a.setBatting(true);
        b.setBalling(true);
    } else {
        a.setInningType(Team.InningType.BOWLING);
        b.setInningType(Team.InningType.BATTING);
        a.setBalling(true);
        b.setBatting(true);
    }
}`

在第一局之后,球队之间的击球和保龄球切换。所以我写了下面的代码来切换角色。

public void switchViewStubs() {
    //stub1.setVisibility(View.GONE);
    //stub2.setVisibility(View.GONE);
    alloversCompleted = true;
    createViewStubs();
    if (a.getInningType().equalsIgnoreCase("batting")) {
        newStub1.setLayoutResource(R.layout.bowling_team_layout);
        newStub2.setLayoutResource(R.layout.batting_team_layout);
        a.setBatting(false);
        b.setBatting(true);
    }
    if (a.getInningType().equalsIgnoreCase("bowling")) {
        newStub1.setLayoutResource(R.layout.batting_team_layout);
        newStub2.setLayoutResource(R.layout.bowling_team_layout);
        b.setBatting(false);
        a.setBatting(true);
    }
    newStub1.inflate();
    newStub2.inflate();
    instantiateViewsAndSettingListenersToButtons();
    aRuns = 0;
    bRuns = 0;
}

设置文本以运行 TextView 的代码是造成麻烦并占用我宝贵的 2-3 小时的代码,尽管我在编写逻辑时是无辜且正确的。这是代码。

 if (view.equals(oneRun)) {
                //incrementBalls();
                totalRuns++;
                if (a.isBatting()) {
                    //new AlertDialog.Builder(this).setTitle("batting staus").setMessage("a is batting").show();
                    aRuns++;
                    //a.setNumberOfRunsScored(aRuns);
                    if (!alloversCompleted) {
                        incrementBalls();
                        updateRuns(aRuns);
                    }
                    if (alloversCompleted) {
                        updateRuns(0);
                        alloversCompleted = false;
                    }
                    if ((totalRuns > targetRuns) && (secondInning)) {
                        setTextOnFooter("Team A wins");
                    }
                }
                if (b.isBatting()) {
                    //new AlertDialog.Builder(this).setTitle("batting staus").setMessage("b is batting").show();
                    bRuns++;
                    //b.setNumberOfRunsScored(bRuns);
                    if (!alloversCompleted) {
                        incrementBalls();
                        updateRuns(bRuns);
                    }
                    if (alloversCompleted) {
                        updateRuns(0);
                        alloversCompleted = false;
                    }
                    if ((totalRuns > targetRuns) && (secondInning)) {
                        setTextOnFooter("Team B wins");
                    }
                }
            }

上述代码中(b.isBatting)的代码块即使切换了击球角色也根本没有执行。但是我已经编写了正确的代码和逻辑,将击球角色更改为保龄球,将保龄球角色更改为击球。 我使现金无效并重新启动了android studio,但代码行为不正确。 我听说 Gradle 构建系统很快,因为它只考虑和构建更改的代码,而不是一次又一次地构建所有代码。 我怀疑 Gradle 中的一些故障没有考虑到我对布尔变量所做的更改。两天后,我重建代码并再次运行它,它运行得非常好。 这种行为不一致且有问题。 任何人都可以预测一定出了什么问题吗? Gradle 版本是 gradle:4.2.2

【问题讨论】:

    标签: java android android-studio gradle


    【解决方案1】:

    如果一个团队可以是“打球”/“保龄球”或“击球”,但不能两者兼而有之,那么您对Team 类的设计很容易出错(因为您可以将这两个值都设置为 true,或者将这两个值都设置为 false这意味着球队既不是“投球”也不是“击球”)。

    让我们假设在开始时 a 队正在击球(a.batting 为真,a.balling 为假),而 b 队相应地在击球(b.batting 为假,b.balling 为真)。

    如果现在调用void switchViewStubs(),它将改变两支球队的“击球”状态并保持“击球”状态不变。因此我们会遇到以下情况:

    • a.batting 是假的,a.balling 是假的
    • b.batting 是真的,b.balling 是真的

    这是否意味着 b 队正在与自己对战?


    如果这个“balling”/“bowling”或“batting”是真正的排他性的,你应该改变你的Team类如下:

    public class Team {
        private boolean batting;
    
        public boolean isBatting() {
            return batting;
        }
    
        public void setBatting(boolean batting) {
            this.batting = batting;
        }
    
        public boolean isBalling() {
            return !batting;
        }
    

    【讨论】:

    • 您好,这是一个宝贵的建议。为了设置/指示一种状态,我使用了两个 bool 变量。这很容易出错。感谢您指出缺陷。
    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多