2015-04-09 3 views
0

Когда я запускаю свое приложение, он будет постоянно застревать в цикле while. Он должен выйти из цикла while, когда нажата кнопка, однако даже после нажатия кнопки она продолжает зацикливаться.Java (Android) застрял во время цикла

View.OnClickListener listener11 = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      temp1 = button[0]; 
      temp3 = button[0].getBackground(); 
      state++; 
     } 
    }; 


     while(state == 0) { 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      button[0].setOnClickListener(listener11); 
     } 

переменные: состояния является INT TEMP1 является кнопкой temp3 является Drawable

задержка там, потому что я на самом деле есть 20 кнопок и у меня есть setOnClickListeners для всех кнопки внутри этого цикла, поэтому я думаю, что он вызывает его сбой без задержки. Другой вопрос заключается в том, возможно ли иметь setOnClickListeners вне цикла while, но все же быть в состоянии проверить нажатие кнопки внутри цикла?

+0

Вы уверены, что прослушивается onClick? Вы пытались добавить инструкцию печати для увеличения значения состояния? –

+0

Это происходит на основной теме? –

+0

Его обычно плохой идеей, чтобы спать основной поток, так как он остановит все взаимодействие пользователя с обработкой –

ответ

0

Проблема заключается в том, что вы нажимаете кнопку, пока поток находится в спящем состоянии, в результате чего событие не запускается, и поэтому состояние никогда не изменяется.

+0

Как только петли while начнутся, я буду постоянно нажимать кнопку. Даже если спящего состояния не было, я все равно застрял бы в цикле. – Kaisado

+0

Нет смысла устанавливать слушатель в цикле while, он должен выполняться только один раз –

+0

Но он не должен работать? – Kaisado

0

Я не уверен, что именно то, что код должен делать, потому что я понятия не имею контекста, но я думаю, думаю, вы могли бы удалить while цикл в целом:

// initialize the listener 
View.OnClickListener listener11 = new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // add code that runs when button is clicked here 
    } 
}; 

// now that we have the listener all set up we add it to the button, at which point it just keeps listening for you, no need to put the thread to sleep 
button[0].setOnClickListener(listener11); 

UPDATE: Итак, потому что вы хотите увидеть, если второе значение соответствует первое значение можно использовать вспомогательный метод:

private String firstValue = ""; 
public boolean isMatch(String mostRecentValue) { 
    boolean match = false; 
    if (firstValue.isEmpty()) { 
     firstValue = mostRecentValue; 
    } else { 
     match = firstValue.equals(mostRecentValue); 
     firstValue = ""; 
    } 
    return match; 
} 

Этот метод принимает значение, и если это первый нажмите на Валу e сохраняется, если это второй щелчок, он сравнивает его с первым щелчком и затем сбрасывает метод. Получено booleanfalse для сравнения, true. Вызвать этот метод из метода onClick() и передать значение кнопок. Я использовал String в качестве примера, но вы можете использовать любой тип объекта.

+0

Причина цикла while (у меня есть 2) заключается в том, что я хочу сохранить свойство кнопки (тот, который я нажимаю из 20 кнопок, которые у меня есть), в кнопку temp (temp1) и сравните эту кнопку темпа с другой кнопкой темпа (темп2). Но я хотел, чтобы первая кнопка, которую я нажал, сохранялась в temp1, а вторая кнопка I нажата для сохранения в temp2. – Kaisado

+0

Я обновил свой ответ на основе вашего комментария :) – Continuity8

0

Вы должны удалить время цикла и просто установить все слушатели в цикле:

for(int i = 0; i< button.length; i++) { 
    button[0].setTag(i); 
    button[0].setOnClickListener(listener11); 
} 

А затем измените слушателя, чтобы быть что-то вроде:

private boolean firstClick = true; 
View.OnClickListener listener11 = new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if(firstClick) { 
      firstClick = false; 
      temp1 = button[(int)view.getTag()]; 
     } else { 
      temp2 = button[(int)view.getTag()]; 
     } 

    } 
}; 
0

Я думаю, что вы могли бы быть непонятно, что делает setOnClickListener. Он не обрабатывает клик, он настраивает обработчик кликов. Строка button[0].setOnClickListener(listener11); будет частью инициализации вашей деятельности, а затем не будет снова вызвана.

Причина, по которой вы застреваете, связана с тем, что основной поток занят в цикле while и не получает возможность обрабатывать события щелчка. События Click обрабатываются в основном потоке, но только тогда, когда он еще не занят чем-то занятым. В этом случае он всегда занят в цикле while. Например, если основной поток обрабатывал метод, который займет 10 секунд, и вы нажмете на него кнопку 3 секунды, нажатие кнопки не будет обрабатываться еще на 7 секунд. В этот момент будет выполнен ранее установленный listener11.

То, что вы пытаетесь достичь, уже обрабатывается Looper. Вы должны думать о способах обработки событий. Итак, другими словами, вся ваша логика должна идти в listener11 или что-то подобное.

Смежные вопросы