2012-05-09 4 views
9

Android의 BluetoothSocket에서 inputstream.read() 함수에 시간 제한을 구현할 수 있습니까?Android에서 BluetoothSocket inputstream.read()에서 시간 초과 구현

Thread.sleep()을 사용해 보았지만 활동이 일시 중지되었습니다.

--- 업데이트 --- 내가 생각을했다

, 다른, 그들 중 하나 (T1) 인터럽트 각 스레드가 슬립 (5000) 할 2 스레드 코드 herereads (T1 & T2)를 중단합니다 다른 스레드 (t2), 다른 스레드에서 다른 스레드 (t2) 읽을 경우 inputstream 다른 스레드 (t1), 0x0D 중단 같은 일부 문자를 검색하지만 여기에 내 질문은, 아무도 나를 도울 수 있습니까? 내가 스레드의 인터럽트() 메소드를 사용하지 않았기 때문에, 나는

이 가 이

--- 업데이트 ---이 내 구현



     public void run(){ 
     while(true){ 
      try { 
      char r; 
      String respuesta = ""; 
      while (true) { 
        r = (char) mmInStream.read(); 
       respuesta += r; 
       if (r == 0x3e) { 
       break; 
        } 
       } 
      respuesta = respuesta.replaceAll(" ", ""); 
      Log.d("respuesta", respuesta); 
      rHandler.obtainMessage(MESSAGE_READ, -1, -1, respuesta).sendToTarget(); 
      } catch (IOException readException) { 
      Log.e("ServicioGeneral", "Error de lectura", readException); 
      this.interrupt(); 
      connectionLost(); 
      // posibly break(); 
      } 
     } 
    } 

입니다 뭔가가 올 때 ... 감사합니다, 누군가가 나를 도울 수 있기를 바랍니다 다른 스레드에서 문제는 mmoutStream에서 0x3e 문자를 얻지 못하면 시간 초과에 도달한다는 것입니다.

두 번째 예제에서 notifyAll()을 사용해야한다고 가정했는데, 언제 readThread()를 시작해야합니까?

+0

API가 실행되는 한, 나는 그렇게하는 방법을 발견하지 못했습니다 ... 아마도 그것을 할 수있는 반사적 인 방법이 있습니다 ...!? – TacB0sS

+0

Bluetooth 소켓과 inputstream 모두 시간 제한을 구현할 방법이 없습니다. 그게 내 문제는 내가 스레드와 처리기를 시도했지만 아직 구현할 수 없습니다 ... 답변을 주셔서 감사합니다 –

+0

문자열에서 공백을 억제하기 위해 "트림()"대신 "replaceAll (" "," ")" –

답변

10

@weeman 당신이 뭔가를 할 수 있습니다, 감사 :

InputStream in = someBluetoothSocket.getInputStream(); 
int timeout = 0; 
int maxTimeout = 8; // leads to a timeout of 2 seconds 
int available = 0; 

while((available = in.available()) == 0 && timeout < maxTimeout) { 
    timeout++; 
    // throws interrupted exception 
    Thread.sleep(250); 
} 

byte[] read = new byte[available]; 
in.read(read); 

처음 특정 시간 제한 스트림에서 읽을 수있는이 방법. 스레드가 실제로 입력 스트림에서 무언가를 읽으면 응용 프로그램을 알리기 위해 이벤트 핸들러의 어떤 종류를해야 할 수도 있습니다이 당신에게 사용

Thread readThread = new ReadThread(); // being a thread you use to read from an InputStream 
try { 
    synchronized (readThread) { 
     // edit: start readThread here 
     readThread.start(); 
     readThread.wait(timeOutInMilliSeconds); 
    } 
catch (InterruptedException e) {} 

: u는 이런 식으로 뭔가를 시도 할 수 있습니다 당신을 읽는 언제든지 시간 제한을 구현하려면 .

도움이 되었기를 바랍니다.

---- 편집 :

내가 어떤 핸들러를 사용하지 않고 예를 구현했습니다.

Socket s = new Socket("localhost", 8080); 
    final InputStream in = s.getInputStream(); 

    Thread readThread = new Thread(new Runnable() { 
     public void run() { 
      int read = 0; 
      try { 
       while((read = in.read()) >= 0) { 
        System.out.println(new String(new byte[]{ (byte) read })); 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 

    synchronized (readThread) { 
     readThread.start(); 
     try { 
      readThread.wait(2000); 

      if(readThread.isAlive()) { 
            // probably really not good practice! 
       in.close(); 
       System.out.println("Timeout exceeded!"); 
      } 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
+0

아주 좋은 시간 초과 구현하지만 내 코드에서 작동하도록 해달라고 해달라고 내 손을 줄 수 있다면 내 대답을 업데이 트했습니다 ... 감사합니다 ... 넣어 방법에 의해

 byte[available] read=new byte[available] 
이고
 byte[] read=new byte[available]; 

+0

아, 예. 당신 말이 맞아요. 나는 그것을 바꾸고 당신의 업데이트 된 질문에 대한 답변을하려고 노력할 것입니다. – Weeman

+0

감사합니다 @ weeman 코드를 읽은 후이 시간 제한 작동 방식을 이해하고 내 마이크로 컨트롤러에서 응답을받지 못한 경우 구현할 수 있습니다. 감사합니다 ... –