2014-11-19 4 views
0

안녕하세요. 그리고 저는 당신에게 조언을 구하러 왔습니다. 기본적으로 다음과 같은 두 가지 방법이있는 클래스가 있습니다. 직렬 포트 (UART)로 데이터를 보내고 데이터를받습니다. 잘 작동합니다.안드로이드 쓰레드에 대한 조언

이제는 직렬 포트에 데이터를 전송하는 방식으로 수정해야합니다. serialPort.writeBytes (src.getBytes()); 및 3 초 동안 회신을 기다리는 경우, 3 초 이내에 회신을 받으면 TextView로 업데이트해야하고 그렇지 않으면 두 번째 데이터를 보내야합니다 (serialPort.writeBytes (src1.getBytes());) 다시 응답을 기다립니다.

나는 그것을 배우기 시작한 이래로 스레드 및 처리기의 전문가는 아닙니다. 이것에 대해 조언 해주세요. 시간 내 주셔서 대단히 감사합니다.

public void sendData(){ 
    final String src = "MYDATA\r"; 
    final String src1 = "MYDATA1\r"; 
    serialPort.writeBytes(src.getBytes()); 
    **// Pause here and wait for the reply** 
    serialPort.writeBytes(src1.getBytes()); 
    **// Pause here and wait for reply** 
} 




private class ReadThread extends Thread { 
    byte[] buf = new byte[512]; 

    @Override 
    public void run() { 
     super.run(); 
     while (!isInterrupted()) { 
      int size; 
      if (mInputStream == null) 
       return; 
      size = serialPort.readBytes(buf); 

      if (size > 0) { 

       byte[] dest = new byte[size]; 
       System.arraycopy(buf, 0, dest, 0, size); 
       byteLinkedList.offer(dest); 
       onDataReceived(); 

      } 
     } 
    } 
} 

이제

+0

Android 태그가 아닌 더 많은 뷰를 얻기 위해 Java 태그를 추가했습니다. 귀하의 질문에 대해서는, sendData()를 스레드 실행 메소드 내에서 호출하고 첫 번째 바이트를 보내고 readData()를 호출하고 Thread.sleep (3000)을 수행 한 다음 데이터를 수신했는지 확인합니다. 초를 이미 통과 한 경우), 두 번째 청크 청크를 보내거나 청취하지 않으면 아무것도하지 않습니다. – momo

답변

0

이것은 답변이 아닙니다. 충분한 담당자가 없기 때문에 의견을 말할 수 없습니다.

나는 momo에 동의합니다. 그래서 당신은 다음과 같은 것을 갖게 될 것입니다 :

class SendThread extends Thread{ 

    boolean gotData = false; //flag to check if data is received. 

    @Override 
    public void run(){ 
     while(gotData == false){ 
      new Runnable() { 
       @Override 
       public void run(){ 
        //SendData code 
        //if you get Data change gotData = true; 
       } 
      }.run(); 
      Thread.sleep(3000); //sleep for 3 secs 
     } 
    } 
} 
0

당신이 복잡한 상황이없는 경우, 당신은 안드로이드 AsyncTask을 사용할 수 있습니다 - 검색을하고 당신이 그것을에 대한 참조를 많이 찾을 수 있습니다.

기본적으로 데이터 수신시 응답 할 수있는 인터페이스가 필요합니다. 폴링은이 스레드에서 wait이라고 부르는 문제입니다. 대기에 익숙하지 않은 경우 쉽게 검색 할 수 있습니다.

중요한 문제는 UI가 wait이 아니어야하며 스레드 또는 AsyncTask가 없어야한다는 것입니다.

스레드를 사용하기로 결정한 경우 간단한 "리스너"(별칭 interface)를 만듭니다. 협박하는 것처럼 보일 수도 있지만 기본적으로 사용자 정의 스레드로 전달해야하는 빈 클래스입니다.

또한이 과정에서 활동이 계속 표시 될지 고려해야 할 수도 있습니다. http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html

당신이 정말로 정의하지 않은 이후 :이되지 않을 수도 있습니다, 그리고 당신은 여전히 ​​백그라운드에서 작업을 완료해야하는 경우이 옵션의 좋은 "개요"인 Service

가 필요합니다 전체 유스 케이스의 경우 더 많은 연구를하거나 좀 더 구체적으로해야 할 것입니다. 그러나 이것은 올바른 방향으로 나아갈 것입니다.