2017-11-24 6 views
0

그래서 저는 프로젝트를 진행하고 있습니다. 블루투스를 통해 앱과 통신하는 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; 메서드 호출 후 스레드가 데이터를 수신 대기하지 않는 이유는 무엇입니까? 메서드가 호출되지 않으면 처리기가 무한 반복 루핑을 유지합니다.

답변

0

이 코드를 실제로 시도하지는 않았지만 아이디어를 얻은 것으로 보입니다. start()을 사용하면 스레드를 시작하고 stop()을 사용하여 스레드를 중단합니다. Runnable은 while 루프를 구현하여 영원히 계속 실행될 수 있습니다.) 그러나 나는 어느 시점에서 멈추지 않을 것입니다. 희망이 도움이!

private Thread thread;  

public void start() { 
    if (thread != null) return; 
    thread = new Thread(new ListenerRunnable()); 
    thread.start(); 
} 

public void stop() { 
    if (thread == null) return; 
    thread.interrupt(); 
    thread = null; 
} 

private static class ListenerRunnable implements Runnable { 

    @Override 
    public void run() { 
     while (true) { 
      try { 

       // !!! Here goes your code to listen !!! 

      } catch (final InterruptedException e) { 
       if (Thread.currentThread().isInterrupted()) { 
        break; 
       } 
      } 
     } 
    } 
} 
+0

감사합니다. 그 일은 올바른 길로 나를 잡았고 약간의 일들을 깨끗이합니다. takeDamage 메서드에서 내 beginListenForData() 메서드를 호출하고 스레드도 다시 시작합니다. 나는 그것이 가장 효율적이거나 적절한 방법인지는 모르겠지만 작동한다! – Seraphiim

+0

@ user3525633 도움이 될 것입니다.) –