Альтернативы прерывания потока?

java android multithreading

157 просмотра

2 ответа

Создание приложения фонарика в режиме SOS. Имеет 3 кнопки (On, Off и SOS). Приложение работает в обычном режиме включения и выключения, но не в режиме SOS (режим SOS не выключается)

//this method gets called when Off button is pressed
    private void turnOffFlash() {
            if (FlashOn) {
                if (myCamera == null || myParameters == null) {
                    return;
                }
                myParameters = myCamera.getParameters();
                myParameters.setFlashMode(Parameters.FLASH_MODE_OFF);
                myCamera.setParameters(myParameters);
                myCamera.stopPreview();
                try {
                    if (SOSon)
                        Flashthread.interrupt();
                    SOSon = false;
                } catch (Exception ex) {
                    throw ex;
                }
                FlashOn = false;
                number_of_press=0;
            }
        }

и Flashthreadздесь используется

void onSOSPress() {
        if (number_of_press == 1) {
            try {
                SOSon = true;
                if (!Flashthread.isInterrupted()) {
                    if (SOSon) {
                        Flashthread = new Thread(new Runnable() {
                            @Override
                            public void run() {
                                for (int i = 0; i < System.currentTimeMillis(); i++) {
                                    if (FlashOn) {
                                        myParameters.setFlashMode(Parameters.FLASH_MODE_OFF);
                                        myCamera.setParameters(myParameters);
                                        FlashOn = false;
                                    } else {
                                        TurnOnFlash();
                                    }
                                    try {
                                        Thread.sleep(1000);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }

                                }
                            }
                        });
                        Flashthread.start();
                    }
                } else
                    Flashthread.resume();
            } catch (Exception ex) {
                throw ex;
            }
        }
    }

В этом turnOffFlashметоде, поскольку я прочитал, что метод Interrupt на самом деле не «прерывает» / убивает поток, что я могу использовать вместо того, Thread.Interrupt();чтобы нажатие Offкнопки останавливало SOSрежим? Я попробовал stop()и , destroy()но и разбился приложение.

Автор: Anurag Joshi Источник Размещён: 08.11.2019 11:29

Ответы (2)


1 плюс

Решение

То, что вы должны использовать, это Handlerкак предложено в комментариях, но если вы хотите придерживаться этой системы, используйте флаг, чтобы сказать вашей нити прекратить:

boolean shouldStop = false;

...
while (!shouldStop){
  if(FlashOn){
    ...//do SOS stuff
  }
}

...
public void endSOS(){
  shouldStop = true;
}
Автор: Chris Thompson Размещён: 20.08.2016 03:21

1 плюс

Вы хотите использовать, Thread#interrupt()если хотите, чтобы было сгенерировано Исключение.

boolean isClose = false;

while(!isClose){
  try {
      // Your code here
  } catch (InterruptedException e) {
     if(isClose){
        break;
     }
  }
}

public void killThread(){
  isClose = true;
  interrupt();
}

Для реализации кода.

 MyCustomThread t = new MyCustomThread(....);

 // Assuming that the thread is already running
 t.killThread();

Этот подход часто используется в одной из популярных библиотек, таких как Volleyи т. Д.

Автор: Enzokie Размещён: 20.08.2016 03:32
Вопросы из категории :
32x32