Я пытаюсь писать сообщение на стандартный вывод в Android каждую секунду, в течение которой удерживается данная кнопка (я намерен разместить там метод позже). Я использую переключатель в стандартном методе 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, поэтому, думаю, я просто что-то упускаю.