首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Gradle/Android的不一致行为/性能,特别是带bool变量的

Gradle/Android的不一致行为/性能,特别是带bool变量的
EN

Stack Overflow用户
提问于 2021-08-31 06:04:29
回答 1查看 57关注 0票数 1

我正在开发一个模拟板球游戏的应用程序。我的逻辑是正确的,但程序不断提供错误的输出,因为变化没有得到反映。我使缓存失效,并重新启动了android工作室。但是,没有反映出这些变化的小故障仍在继续。这些变化与bool变量特别相关。两天后,突然间,我运行了这个应用程序,它的表现就像预期的那样。我很困惑,在Gradle构建系统中有什么问题吗?这些乱七八糟的东西占用了我很多时间。我正在考虑改用其他的android。哪一种更好,不使用梯度?因为我对Android和Gradle感到沮丧。我并不是想散布对Android和Gradle的仇恨,但我对其性能和不一致深感沮丧。

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

代码如下:

代码语言:javascript
运行
复制
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中,我制作了类Team的两个对象为,即a“"b"”。在比赛开始时,一个随机的结果决定哪个队先击球,哪个队打拳头。因此,对于第一局,我将行为设置为:

代码语言:javascript
运行
复制
`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);
    }
}`

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

代码语言:javascript
运行
复制
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个小时的代码,尽管我是无辜的,而且写逻辑是正确的。这是密码。

代码语言:javascript
运行
复制
 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,但是代码不正确。我听说Gradle构建系统是快速的,因为它只考虑和构建修改过的代码,而不是一次又一次地构建所有代码。我怀疑Gradle中的一些故障没有考虑到我对bool变量所做的更改。两天后,我重新构建了代码,并再次运行,它运行得非常好。这种行为是不一致的和有问题的。有人能预测出一定是哪里出了问题吗?分级版本是gradle:4.2.2

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-31 08:25:06

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

让我们假设在开始时,a队是击球队(a.batting是真,a.balling是假),B队是相应的球(b.batting是假的,b.balling是真的)。

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

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

这是否意味着B队在对抗自己?

如果这个“滚球”/“保龄球”或“击球”真正是排他性的,那么您应该按照以下方式更改您的Team类:

代码语言:javascript
运行
复制
public class Team {
    private boolean batting;

    public boolean isBatting() {
        return batting;
    }

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

    public boolean isBalling() {
        return !batting;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68993620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档