Я пытаюсь написать сообщение для stdout в андроиде каждую секунду, для которой удерживается данная кнопка (я намерен разместить там метод позже). Я использую переключатель в стандартном методе onTouch для обнаружения нажмите кнопку:Почему рабочий поток застревает в цикле при отпускании кнопки?
protected void setFab(FloatingActionButton fab) {
fab.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
System.out.println("Button pressed");
handleButtonDown();
return true;
}
case MotionEvent.ACTION_UP: {
System.out.println("Button released");
handleButtonUp();
return true;
}
default:
return true;
}
}
});
}
И глобальные два глобальных булевы:
private boolean captureThreadRunning = false;
private boolean cancelCaptureThread = false;
которые должны остановить зацикливание, когда кнопка отпущена:
public void handleButtonUp() {
cancelCaptureThread = true;
}
Однако, когда я запускаю рабочий поток, он застревает в бесконечном цикле, даже когда кнопка отпускается и, следовательно, глобальное логическое значение должно быть изменено:
public void handleButtonDown() {
System.out.println("Capture thread running: " + captureThreadRunning);
if (!captureThreadRunning) {
System.out.println("Thread starting");
startCaptureThread();
}
}
public void startCaptureThread() {
System.out.println("Thread started");
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
captureThreadRunning = true;
System.out.println("Got to try");
while (!cancelCaptureThread) {
System.out.println("Success");
try {
System.out.println("Falling asleep");
Thread.sleep(1000);
System.out.println("Slept 1000");
} catch (InterruptedException e) {
throw new RuntimeException(
"Interrupted.", e);
}
}
} finally {
System.out.println("got to finally");
captureThreadRunning = false;
cancelCaptureThread = false;
}
}
});
thread.run();
}
Не только это, но и пользовательский интерфейс также застыл, что, безусловно, не должно, потому что я делаю все в отдельной теме. Когда я отпускаю кнопку, цикл должен останавливаться, потому что логическое значение изменяется. Я совершенно новый и для обоих потоков, и для Android, поэтому, я думаю, я просто что-то пропустил.