我将如何实现 2个异步后台循环,以检查android:Java中是否满足不同的条件,以下是有关所面临问题的更多信息,以及一些到目前为止如何实现它的源代码。
使用Android Studio用Java编写的研究应用程序。
移动应用程序将在实验室中用于捕获原始图像,并将其传输到桌面上,然后使用图像处理库对其进行处理。
问题-> 解决方案:
1:设备捕获的内存有限,大图像-> 会在捕获图像时传输图像。
2 :在捕获过程中,请勿触摸设备(例如,按捕获或调整相机设置时),因为设备会移动并产生不准确的图像-> 具有“远程控制”功能,该设备通过TCP / IP连接与台式机进行通信,更改台式机上的摄像头设置将导致设备摄像头也被调整。
在应用程序上有一个页面,其中填写了桌面的IP / PORT详细信息,可以从那里建立连接,一旦成功建立连接,就会开始运行2个异步后台循环,并在下面详细说明每个理由:
note队列是一个ArrayList,最初为空,它将仅保存捕获的每个图像的名称
在摄像机设置页面上,用户设置突发条件限制,该条件用于检查条件(如果队列为空,是否已达到突发条件限制), 如果满足条件:应用程序已成功发送所有捕获的图像,它将停止两个循环。 否则(如果未满足):线程休眠3秒钟,醒来时再次检查
-条件1: while(true)无限循环->在满足条件时爆发
-条件2: while(队列== 0 && count ==突发) 满足:已发送所有图像:执行中断; (打破上面的循环) 未满足:线程睡眠,因为尚未发送图像,可能尚未将其添加到队列中...
-条件3:(队列> 0时) 满足:从队列索引0获取图像名称,通过tcp / ip发送图像,发送后,删除第一个索引,将第二个图像向下移至索引0,队列的大小将大于0,因此它将再次运行此块...
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中没有发现错误消息,应用程序没有崩溃,它一直处于困境,直到手动退出应用程序并再次启动它为止。
如果可以更好地实现我的目标,请告诉我,或者我可以做些什么来改善它。