Android-студия Java поток не работает должным образом
У меня есть кнопка переключения в моем приложении для Android. Я делаю поток, работа которого случайно мигает. Я ставлю метод Start, когда кнопка переключателя включена, и прерываю метод, когда кнопка выключена. Это работает в первый раз, но во второй раз, когда я касаюсь кнопки переключения, приложение завершается автоматически. Я нажимаю кнопку, затем работает случайное мигание, затем я останавливаю кнопку, и мигание прекращается, но когда я запускаю его снова с помощью кнопки, приложение останавливается само по себе.
xx=new Runnable()
{
@Override
public void run()
{
synchronized (this)
{
while (true)
{
try {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
c1.sleep(100);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
//c1.interrupt();
}
catch (Exception e)
{
Thread.currentThread().interrupt();
break; //this is a MUST
}
}
}
}
//}
};
c1 =new Thread(xx);
s1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (s1.isChecked())
{
c1.start();
}
else
{
c1.interrupt();
}
}
});
1 ответ
Почему вы должны использовать синхронизированный, когда вы используете его, он блокирует ресурс, поэтому никто не будет использовать его снова, пока он не будет выпущен слушателями, вы можете сохранить синхронизацию, но, по крайней мере, остановитесь вместо true во время использования флага и когда кнопка выключена сделает его ложным
// set this to true to stop the thread
volatile boolean shutdown = false;
также вам нужно использовать в catch, чтобы остановить поток, так что не заставляйте его останавливать приложение:)
catch (InterruptedException e) {
// good practice
Thread.currentThread().interrupt();
return;
}