Почему рабочий поток зацикливается при отпускании кнопки?

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


person rozsatib    schedule 08.04.2016    source источник


Ответы (1)


Но вы действительно выполняете свой код в своем основном потоке. Обратите внимание, что вы звоните

thread.run();

поэтому ваш путь выполнения входит в бесконечный цикл. Измените его на

thread.start();

Это положит начало новому Thread

person Pelocho    schedule 08.04.2016