~ Соревнования ~
Как бы я реализовал 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 не найдено сообщений об ошибкахприложение не падает, оно остается в подвешенном состоянии до тех пор, пока оно не выйдет из приложения и не запустится снова.
Если есть лучшая реализация достижения моей цели, пожалуйста, дайте мне знать, или если что я могу сделать, чтобыУлучши это.