【问题标题】:How to use few buttons, with dependencies between them? Android Studio如何使用几个按钮,它们之间有依赖关系?安卓工作室
【发布时间】:2018-11-01 14:33:38
【问题描述】:

我有 4 个按钮,每个按钮都有不同的操作(假设每个操作需要 2 分钟)

当我单击两个按钮时(它们之间有几分钟的时间),它们仍然进入“if”部分,尽管我放了标志。

这是我的部分代码:

   southToNorth.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            north.incCounter();
            north.setWaitingState(true);
            pushToQueue(1);

            if (isWorking==0) {
                isWorking++;
                start();
            }
        }
    });

    westToEast.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            east.incCounter();
            east.setWaitingState(true);
            pushToQueue(2);

            if (isWorking==0) {
                isWorking++;
                start();
            }
        }
    });

我不认为这是一个同步问题,我什至把这段代码放在了 start 函数的顶部:

   private void start() {

    if(isWorking>1)
        return; 

但是,它们都是 start 函数,这是我试图避免的。

(我有一个全局标志“int isWorking”初始化为零)

为什么他们都进入了 if 部分?我该如何解决?

非常感谢!

【问题讨论】:

  • 你设置过isWorking吗? pushToQueue() 是做什么的?
  • isWorking 在运行时初始化为 0。只有当 start() 函数完成后,isWorking 才会再次设置为 0。 pushToQueue 负责在屏幕上做一些改变,没有连接到程序流程
  • start() 完成时,您将isWorking 设置回零?如果您的操作是异步的,那么isWorkng 将立即被设置回零。在将isWorking 设置为零之前,您需要监听操作何时完成。

标签: android synchronization android-button


【解决方案1】:

一个全局标志应该这样做。你说你已经尝试过了,但你实际上并没有提供如何你是如何尝试的,所以我无法具体提供帮助。

制作两个变量和一些静态字段:

private static final int ACTION_NONE = -1;
private static final int ACTION_ONE = 0;
private static final int ACTION_TWO = 1;
private static final int ACTION_THREE = 2;
private static final int ACTION_FOUR = 3;

private boolean actionRunning = false;
private int queuedAction = ACTION_NONE;

当你尝试运行一个动作时,检查当前是否有一个动作正在运行:

if (actionRunning) {
    queuedAction = /* the corresponding static field */;
} else {
    queuedAction = ACTION_NONE;
    actionRunning = true;
}

然后,当您使用的任何操作完成时,运行相应的排队操作:

switch (queuedAction) {
    case ACTION_ONE:
        //run action 1
        break;
    case ACTION_TWO:
       //etc
    ...
}

【讨论】:

  • 您好,谢谢。我编辑了我的问题,希望现在更清楚
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2018-01-08
  • 2018-01-29
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多