я получил следующий кусок кода:по расписанию Таймер блокировки себя
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
TextureView textureView = (TextureView) findViewById(R.id.texture);
if (textureView != null) {
try {
Log.i("MainActivity", "Read start");
String str = readQr(textureView.getBitmap());
if (str != null)
Log.i("MainActivity", str);
else Log.i("MainActivity", "No QR Code found.");
} catch (NotFoundException ex) {
Log.i("MainActivity", "No QR Code found.");
} catch (ChecksumException | FormatException e) {
e.printStackTrace();
}
}
}
}, 0, 250);
Он должен проверить наличие QR-кода в TextureView
четыре раза в секунду. Расчет занимает немного меньше одной секунды. Проблема в том, что таймер открывает только один поток, который блокирует себя => Задача запускается только один раз в секунду.
Согласно this комментарий scheduleAtFixedRate
должен сделать трюк ... Но это не так, он ведет себя точно так же, как schedule
в моей ситуации.
Что было бы лучшим вариантом для достижения того, что я хочу?
EDIT: Я заменил таймер на ScheduledExecutorService
, как это предложено в комментариях, но это все равно приводит к точному поведению.
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10); // I know it's too much, I just tried using 10 Threads because 4 did still not work.
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
final TextureView textureView = (TextureView) findViewById(R.id.texture);
if (textureView != null) {
try {
Log.i("MainActivity", "Read start");
String str = readQr(textureView.getBitmap());
if (str != null)
Log.i("MainActivity", str);
else Log.i("MainActivity", "No QR Code found.");
Log.i("MainActivity", "Read end");
} catch (NotFoundException ex) {
Log.i("MainActivity", "No QR Code found.");
Log.i("MainActivity", "Read end");
} catch (ChecksumException | FormatException e) {
e.printStackTrace();
Log.i("MainActivity", "Read end");
}
}
}
}, 0, 250, TimeUnit.MILLISECONDS);
Попробуйте использовать AsyncTask проверить QR-код в фоновом режиме. –
Попробуйте заменить таймер на ScheduledExecutorService. Это работает для меня правильно –
@HareshChhelana '' 'textureView.getBitmap()' '' необходимо вызывать из потока пользовательского интерфейса. Я не могу получить его растровое изображение из потока AsyncTask. – Benni