Как манге блокировать очередь, если я хочу поставить () только когда она пуста (android studio)? - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть приложение, которое я написал в android studio, которое захватывает изображения с помощью функции обратного вызова onPreviewFrame (), в котором я отправляю изображение в мой класс Communicator, который является потоком, который связывается с моим python сервером, который на моем компьютере. Моя проблема в том, что серверу требуется время для обработки каждого изображения, поэтому я хочу отправить только самое обновленное изображение, затем дождаться ответа и затем отправить самое обновленное изображение и т. Д. c. Проблема в том, что функция put () очереди Blocking ожидает, пока в очереди блокировки не будет свободного места, но я хочу выбросить изображение, если места нет (емкость очереди = 1).

Я сделал это:

Функция onPreviewFrame для получения изображений:

public void onPreviewFrame(byte[] data, Camera camera) {
                    try{
                        Camera.Parameters parameters = camera.getParameters();
                        Camera.Size size = parameters.getPreviewSize();
                        YuvImage image = new YuvImage(data, parameters.getPreviewFormat(),
                                size.width, size.height, null);
                        if(queue.isEmpty())
                            queue.put(image);
                    }catch (InterruptedException e){
                        Log.e("mydebug", e.getMessage());
                    }
                }

Функция коммуникатора run ():

while(true){
                try{
                    if (!queue.isEmpty())
                        this.sendmsg(queue.peek());
                        ans = receive_message();
                        if (ans.get("data").equals("True"))
                            beeper.startTone(ToneGenerator.TONE_CDMA_HIGH_PBX_L, 250);
                        this.queue.clear();
                }catch (Exception e){
                    Log.e("mydebug", e.getMessage());
                }
            }

Моя проблема в том, что по какой-то причине сервер не получает никаких изображений, когда я запускаю этот код. Но когда я запускаю его с точкой останова, она работает!

...