그래서 저는 프로젝트를 진행하고 있습니다. 블루투스를 통해 앱과 통신하는 Arduino 로봇이 있습니다. 본질적으로 Arduino는 다양한 센서가 장착 된 전투 봇입니다. 로봇이 촬영 된 것을 (IR 코드를 통해) 인식하면. 그것의 건강이 감소 될 수 있도록 앱에 메시지를 보낸다. (Arduino는 메시지의 끝을 알리는 구분 기호로 '#'을 사용하여 소문자 'h'를 전송합니다. 이제 스레드를 실행하여 데이터를 수신하려고하고 문자 ('h') 또는 다른 문자 문자가 응용 프로그램에서 처리되고 적절한 함수가 호출됩니다. 이제 내 문제는 내 함수를 한 번만 호출 할 수 있습니다. 나는 스레드가 처음이며 스레드를 다시 시작하지 않는 이유를 이해하는 데 어려움이 있습니다. 더 문자를 듣고 계속합니다. 여기 스레드는 한 번만 실행됩니다. Java - Android
스레드가 데이터를 듣고있다. 그것 좀 지저분를 내가 시도하고 문제를 또한 여기void beginListenForData(){
final Handler handler = new Handler();
final Handler handler2 = new Handler();
final byte delimiter = 35; //ASCII for #
stopWorker = false;
readBufferPosition = 0;
readBuffer = new byte[1024];
workerThread = new Thread(new Runnable(){
public void run(){
while(!Thread.currentThread().isInterrupted() && !stopWorker){
try{
int bytesAvailable = mmInputStream.available();
//InputStream mmInputStream = btSocket.getInputStream();
//inTest.setText("INPUT: " + bytesAvailable);
if(bytesAvailable>0){
//inTest.setText("Bytes Available");
byte[] packetBytes = new byte[bytesAvailable];
mmInputStream.read(packetBytes);
for(int i=0;i<bytesAvailable;i++)
{
byte b = packetBytes[i];
if(b == delimiter)
{
byte[] encodedBytes = new byte[readBufferPosition];
System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
final String data = new String(encodedBytes, "US-ASCII");
readBufferPosition = 0;
handler.post(new Runnable()
{
public void run()
{
/*
Possible messages from arduino
r = arduino ready
k = Robot has tilted and is dead
h = robot has been shot
*/
inTest.setText("Received: " + data + "\n" +"Times shot: " + timesShot);
if(data.equals("h")){
//workerThread.interrupt();
System.out.println("ROBOT HAS BEEN SHOT");
robo1.takeDamage(10);
System.out.println("ROBOT HAS CALLED DAMAGE METHOD");
}
//if(data.equals("k")){
// msg("ROBOT FLIPPED!");
//}
}
});
}
else
{
readBuffer[readBufferPosition++] = b;
}
}
}
}
catch (IOException ex)
{
msg("IEXCEPTION TRIGGER");
stopWorker = true;
}
}
}
});
msg("WorkerThread Start");
workerThread.start();
}
을 찾기 위해 추적 코드를 가지고도이 내 takeDamage 방법입니다 약간의 추적자 코드가 거기에 있고 약간의 o를 보여줍니다. 문제를 해결하려고 노력한 것들.
private void takeDamage(int dmg){
ROBOT_HEALTH -= dmg;
msg("Robot Shot");
timesShot++;
System.out.println("ROBOT IS TAKING DAMAGE");
inTest.setText("Times shot: " + timesShot + "\n Robot Health: " + ROBOT_HEALTH);
//workerThread.start();
//msg("Robot Health" + robo1.getHealth() + "\n");
//if(this.getHealth() <= 0){
// //GAME OVER ROBOT DEAD
// Toast.makeText(getApplicationContext(), "ROBOT DEAD",
// Toast.LENGTH_LONG).show();
//}
}
TLDR; 메서드 호출 후 스레드가 데이터를 수신 대기하지 않는 이유는 무엇입니까? 메서드가 호출되지 않으면 처리기가 무한 반복 루핑을 유지합니다.
감사합니다. 그 일은 올바른 길로 나를 잡았고 약간의 일들을 깨끗이합니다. takeDamage 메서드에서 내 beginListenForData() 메서드를 호출하고 스레드도 다시 시작합니다. 나는 그것이 가장 효율적이거나 적절한 방법인지는 모르겠지만 작동한다! – Seraphiim
@ user3525633 도움이 될 것입니다.) –