2

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

ответ

0

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

thread.run(); 

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

thread.start(); 

Это будет начать новую Thread