Как использовать несколько кнопок, с зависимостями между ними? Android Studio - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть 4 кнопки, каждая из которых выполняет свое действие (скажем, каждое действие занимает 2 минуты)

Когда я нажимаю обе кнопки (с несколькими минутами между ними), они все равно попадают в часть «если», хотя флаг, который я поставил.

Вот часть моего кода:

   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();
            }
        }
    });

Я не думаю, что это проблема синхронизации, я даже поместил этот код в начало функции запуска:

   private void start() {

    if(isWorking>1)
        return; 

но, тем не менее, оба они выполняют все функции запуска, чего я пытаюсь избежать.

(у меня глобальный флаг "int isWorking" инициализирован нулем)

Почему они оба попадают внутрь части if? Как я могу решить это?

Большое спасибо!

1 Ответ

0 голосов
/ 01 ноября 2018

Глобальный флаг должен сделать это. Вы говорите, что пробовали, но на самом деле вы не указали , как вы пробовали, поэтому я не могу помочь с этим.

Создайте две переменные и несколько статических полей:

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
    ...
}
...