В приложении Gluon возникла проблема при быстром нажатии кнопки мыши или двойном, тройном нажатии

Я разработал приложение глюона, которое использует uuid для генерации штрих-кода и QRCODE. Использование может переключаться между штрих-кодом и QR-кодом в зависимости от магазина. Штрих-код будет отображаться только в портретном режиме экрана при нажатии на QRCODE (изображение). Таким образом, экран будет автоматически поворачиваться, когда пользователь нажимает на изображение (штрих-код / ​​QR-код).

this.img.setOnMousePressed(event -> {
//Rotate Screen
        Services.get( CMOrientationService.class ).ifPresent( o -> {
            Orientation orientation = Services.get( OrientationService.class )
                    .flatMap(OrientationService::getOrientation)
                    .orElse(Orientation.HORIZONTAL);

            Services.get(LogService.class).ifPresent(service -> service.log("orientation="+orientation.toString()));

            if (orientation == Orientation.VERTICAL) {
                Services.get(LogService.class).ifPresent(service -> service.log("Currently="+orientation.toString()));
                //Change to Barcode
                //GenerateBarQRCode(orientation == Orientation.VERTICAL);
                o.coerceOrientation( Orientation.HORIZONTAL );
            } else {
                Services.get(LogService.class).ifPresent(service -> service.log("Currently="+orientation.toString()));
                //Change to QRCode
                //GenerateBarQRCode(orientation == Orientation.VERTICAL);
                o.coerceOrientation( Orientation.VERTICAL );
            }
            GenerateBarQRCode(orientation == Orientation.VERTICAL);
        } );
});

Проблемы возникают, когда пользователь пытается быстро щелкнуть изображение (двойной, тройной щелчок), оно будет сгенерировано неправильно.

Вы можете проверить это видео, чтобы получить более подробное представление. ).

Принято к сведению. Это ошибка только в Android.


person Sovandara LENG    schedule 28.05.2019    source источник
comment
Возможно, это проблема синхронизации, вы можете попробовать синхронизировать код внутри события onMousePressed, чтобы он мог обрабатывать несколько касаний. Вы также можете использовать атомарный флаг, который не установлен во время обработки и устанавливается, когда обработка завершена, то есть после метода GenerateBarQRCode код не должен выполняться, пока флаг не установлен. При этом нежелательные прикосновения будут поглощены, а не выполнены.   -  person Himanshu    schedule 28.05.2019
comment
Можешь дать мне код?   -  person Sovandara LENG    schedule 28.05.2019
comment
Не уверен, что это сработает, но вы можете проверить свойство clickCount MouseEvent и инициировать изменение только в том случае, если оно 1. Если это не сработает, рассмотрите возможность сохранения времени последнего изменения ориентации, инициированного этим обработчиком событий, и убедитесь, что логика выполняется только в том случае, если с момента последней смены ориентации прошло определенное время.   -  person fabian    schedule 28.05.2019
comment
@fabian Когда я использую clickCount на рабочем столе, он работает нормально. Но в Android clickCount всегда равен 1, поэтому, если мы дважды щелкнем, это событие сработает дважды.   -  person Sovandara LENG    schedule 28.05.2019
comment
@fabian: да, если задержать до 1000 миллисекунд, все заработает. но это влияет на производительность, он показывает черный экран, когда приложение задерживается. Итак, это решение сработало, но я не думаю, что его стоит использовать.   -  person Sovandara LENG    schedule 28.05.2019
comment
Я не это предлагал. Я предлагал сэкономить время на обновление. if (System.currentTimeMillis() - lastUpdate >= 1000) { /* do update */ lastUpdate = System.currentTimeMillis(); } (или с использованием некоторой задержки, отличной от 1000 мс)   -  person fabian    schedule 28.05.2019
comment
Все сработало отлично, спасибо.   -  person Sovandara LENG    schedule 28.05.2019


Ответы (1)


Вы можете использовать такую ​​синхронизацию

// At class level
private Object mutex;
//initialize this object in constructor like this
mutex = this;

this.img.setOnMousePressed(event -> {
//Rotate Screen
synchronized(mutex){
// your code here
       ....
}
});

Однако в приведенном выше примере несколько событий щелчка будут выполняться последовательно. Если вы хотите, чтобы несколько кликов игнорировались до выполнения, вы можете использовать следующий фрагмент кода

// At class level
private boolean mutex = true;

this.img.setOnMousePressed(event -> {
   if(mutex){
     mutex = false;

        // your code here
               ....
     mutex = true;
   }
});
person Himanshu    schedule 28.05.2019
comment
Привет. Спасибо за ответ, но он не работает. Проблема все еще существует - person Sovandara LENG; 28.05.2019
comment
Все события JavaFX выполняются в одном потоке. Это не проблема с параллельными потоками. Если это так, вторая реализация не гарантирует передачу изменений поля mutex между потоками ... - person fabian; 28.05.2019