异步后台循环阻止相机界面打开

时间:2019-05-30 13:15:17

标签: java android multithreading asynchronous background

〜具有挑战性〜

  

我将如何实现 2个异步后台循环,以检查android:Java中是否满足不同的条件,以下是有关所面临问题的更多信息,以及一些到目前为止如何实现它的源代码。

更多信息 ::

使用Android Studio用Java编写的研究应用程序。

移动应用程序将在实验室中用于捕获原始图像,并将其传输到桌面上,然后使用图像处理库对其进行处理。

问题-> 解决方案

1:设备捕获的内存有限,大图像-> 会在捕获图像时传输图像。

2 :在捕获过程中,请勿触摸设备(例如,按捕获或调整相机设置时),因为设备会移动并产生不准确的图像-> 具有“远程控制”功能,该设备通过TCP / IP连接与台式机进行通信,更改台式机上的摄像头设置将导致设备摄像头也被调整。

在应用程序上有一个页面,其中填写了桌面的IP / PORT详细信息,可以从那里建立连接,一旦成功建立连接,就会开始运行2个异步后台循环,并在下面详细说明每个理由:

note队列是一个ArrayList,最初为空,它将仅保存捕获的每个图像的名称

在摄像机设置页面上,用户设置突发条件限制,该条件用于检查条件(如果队列为空,是否已达到突发条件限制), 如果满足条件:应用程序已成功发送所有捕获的图像,它将停止两个循环。 否则(如果未满足):线程休眠3秒钟,醒来时再次检查

背景异步循环1:此循环检查3种情况:

-条件1: while(true)无限循环->在满足条件时爆发

-条件2: while(队列== 0 && count ==突发) 满足:已发送所有图像:执行中断; (打破上面的循环) 未满足:线程睡眠,因为尚未发送图像,可能尚未将其添加到队列中...

-条件3:(队列> 0时) 满足:从队列索引0获取图像名称,通过tcp / ip发送图像,发送后,删除第一个索引,将第二个图像向下移至索引0,队列的大小将大于0,因此它将再次运行此块...

背景异步循环2:仅当勾选了远程复选框时,此循环才会运行,它会检查由桌面发送的指令::

TCP消息从设备(客户端)发送到桌面(服务器),即“正在监听”,服务器获取该消息并等待用户输入,即用户移动滚动条或输入突发量,然后单击应用,所有信息均被发送通过tcp消息发送到设备,即(10,1,1800,0)设备将使用该字符串,将其分解并使用函数获取其列表,该函数采用每个索引并更新设备上的设置,即(burst,autoFocusOn,iso ,flashOn:导致连拍设置为10,自动对焦设置为开,等等...)

  
    
      

总结一下,这是两个异步后台循环,每个循环都是使用带有新Runnable的Thread实现的,如下所示:

    
  
   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中没有发现错误消息,应用程序没有崩溃,它一直处于困境,直到手动退出应用程序并再次启动它为止。

如果可以更好地实现我的目标,请告诉我,或者我可以做些什么来改善它。

0 个答案:

没有答案