Асинхронный фоновый цикл препятствует открытию интерфейса камеры - PullRequest
0 голосов
/ 30 мая 2019

~ Соревнования ~

Как бы я реализовал 2 асинхронных фоновых цикла проверка, выполняются ли различные условия в Android: Java, ниже приведена дополнительная информацияо возникших проблемах, а также некоторый исходный код о том, как я его реализовал.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ ::

Исследовательское приложение, написанное на Java с использованием Android Studio.

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

Проблемы -> решения :

1: Устройство имеет ограниченную память для захвата Большие изображения -> передают изображения во время захвата.

2: Во время захвата не следует прикасаться к устройству (т. Е. При нажатии кнопки захвата или настройке параметров камеры), поскольку устройство будет двигаться и создавать неточные изображения -> функция «дистанционного управления»Когда устройство обменивается данными с рабочим столом через TCP / IP-соединение, изменение настроек камеры на рабочем столе также приведет к настройке камеры устройства.

В приложении есть страница, в которой приведены сведения об IP / PORT рабочего стола.заполнены, оттуда соединение может быть установлено, как только успешно установлено, 2 асинхронных фоновых цикла запускаются, рассуждая для каждой детали, приведенной ниже:

примечание очереди является ArrayList, который изначально пуст, он будетудерживайте только имя каждого захваченного изображения

На странице настроек камеры пользователь устанавливает предел серии, который используется в проверяемом условии (если очередь пуста, достигнут ли предел серии),если условие выполнено: приложение успешно отправило все захваченные изображения и остановит оба цикла.иначе, если не выполнено: поток спит в течение 3 секунд и снова проверяет после пробуждения

Фоновая асинхронная петля 1: Эта петля имеет проверки для 3 условий:

- Условие 1: while (true) бесконечный цикл-> прерывается при выполнении условий

- Условие 2: в то время как (очередь == 0 && count == пакет) выполнено: все изображения отправлены:выполнить перерыв;(выход из цикла выше) не выполнено: спящий поток, поскольку изображения еще не отправлены, возможно, еще не добавлены в очередь ...

- Условие 3: (во время очереди> 0) met: получить имя изображения из индекса 0 очереди, отправить изображение через tcp / ip, после отправки удалить 1-й индекс, сдвинуть второе изображение до индекса 0, размер очереди будет больше 0, поэтому он будет работатьэтот блок снова ...

Фоновый асинхронный цикл 2: Этот цикл запускается только если установлен удаленный флажок, он проверяет инструкции, отправленные рабочим столом: *

TCP-сообщение отправляется с устройства (клиента) на рабочий стол (сервер), т. Е. «Прослушивает», сервер получает это и ждет ввода пользователя, т. Е. Пользователь перемещает полосу прокрутки или количество пакетов ввода, затем нажимает «Применить», вся информация отправляется на устройство черезtcp-сообщение, т. е. устройство (10,1,1800,0) будет принимать строку, разбивать ее и обновлять свой список, используя функцию, которая принимает каждый индекс и обновляет настройки на устройстве, т. е. (burst, autoFocusOn, iso, flashOn:в результате яn пакетный режим установлен на 10, автоматический фокус включен и т. д ...)

Подводя итог, это два асинхронных фоновых цикла, каждый из которых реализован с использованием Thread сновый Runnable, как показано:

   Thread thread = new Thread(new Runnable() {
     @Override
     public void run() {
       runOnUiThread(new Runnable() {
         @Override
         public void run() {

Интерфейс камеры не открывается, т. е. нажатие кнопки камеры приводит к тому, что экран остается полностью черным.

Раньше я не использовал потоки, но для того, чтобы иметь интервалы, в которых условия проверялись в течение определенного периода времени без исчерпания ресурсов, я реализовал потоки, поэтому я могу заставить поток спать, если определенное условие не выполняется, после пробужденияон снова проверит условие, это будет продолжаться в цикле while, при этом в качестве условия прерывания будут отправлены все изображения, т. е. очередь пуста && предельный размер пакета достигнут.

 //START BACKGROUND THREAD
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    while(true){//1st while loop
                        if(imageQueue.size()== burst){
       //save textfile stating that images saved has reached burst count
                            BufferedWriter writer = null;
                            try
                            {
              writer = new BufferedWriter( new FileWriter(  
              fileDir+"/"+fileName+"_Capture.txt"));
              writer.write( ""+burst+" DNG images have been captured   
              on device as: "+fileName);

                            }
                            catch ( IOException e)
                            {
                            }
                            finally
                            {
                                try
                                {
                                    if ( writer != null)
                                        writer.close( );
                                }
                                catch ( IOException e)
                                {
                                }
                            }
                            //break then start image transfer process
                            break;
                        }
                        try {
                        //else sleep for 5 seconds until condition met
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }//end 1st while loop

                    //declarations for second while loop
                    File dirToRemove = getFilesDir();
                    int imgSentCount=0;
                    String target;

                    //send image name + Burst
                    //fileName + burst;



                    while(true){//second while loop
                    if((imageQueue.size()== 0)&& (imgSentCount==burst)){
                        //Image transfer complete
                            BufferedWriter writer = null;
                            try
                            {
                  writer = new BufferedWriter( new FileWriter(  
                  fileDir+"/"+fileName+"_Sent.txt"));
                  writer.write( ""+burst+" DNG images have been sent  
                  from this device as: "+fileName);

                            }
                            catch ( IOException e)
                            {
                            }
                            finally
                            {
                                try
                                {
                                    if ( writer != null)
                                        writer.close( );
                                }
                                catch ( IOException e)
                                {
                                }
                            }
                            break;
 }else if(imageQueue.size()== 0){//waiting for images to be put in queue
                            try {
                    //else sleep for 5 seconds until condition met
                                Thread.sleep(5000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                        }else if(imageQueue.size()> 0){//image is ready  
          to be sent, send images from here + remove image once sent

                            //for loop send each image

                            try {
                                fileName = imageQueue.get(0);
                                target = fileName+".dng";

                Socket s = new Socket(Client.ipString, Client.portInt);
                //BufferedOutputStream put = new  
                BufferedOutputStream(s.getOutputStream());


                        //Send file
                      File myFile = new File(target);
                   byte[] mybytearray = new byte[(int) myFile.length()];

                      FileInputStream fis = new FileInputStream(myFile);
                 BufferedInputStream bis = new BufferedInputStream(fis);
               //bis.read(mybytearray, 0, mybytearray.length);

                DataInputStream dis = new DataInputStream(bis);
                dis.readFully(mybytearray, 0, mybytearray.length);

                 OutputStream os = s.getOutputStream();

                  //Sending file name and file size to the server
                   DataOutputStream dos = new DataOutputStream(os);
                                dos.writeUTF(myFile.getName());
                                dos.writeLong(mybytearray.length);
                  dos.write(mybytearray, 0, mybytearray.length);
                                dos.flush();

                                //Sending file data to the server
                   os.write(mybytearray, 0, mybytearray.length);
                                os.flush();

                                //Closing socket
                                os.close();
                                dos.close();
                                s.close();

                     //upon sending an image, the image is removed   
                   from memory and removed from the queue

       File fileDeleted = new File(dirToRemove, imageQueue.get(0));
                  boolean deleted = fileDeleted.delete();
             Log.i("deleted", "deleted image:"+imageQueue.get(0));

                                    imageQueue.remove(0);
                                } catch (UnknownHostException e) {
                                e.printStackTrace();
                            } catch (FileNotFoundException e) {
                                e.printStackTrace();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }//end second while loop
                }
            });
        }
    });

    thread.start();

    startActivity(new Intent(Setting.this, Camera.class));
  }

В logcat не найдено сообщений об ошибкахприложение не падает, оно остается в подвешенном состоянии до тех пор, пока оно не выйдет из приложения и не запустится снова.

Если есть лучшая реализация достижения моей цели, пожалуйста, дайте мне знать, или если что я могу сделать, чтобыУлучши это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...