2012-05-09 12 views
9

Ist es möglich, ein Timeout in einer inputstream.read() - Funktion von einem BluetoothSocket in Android zu implementieren?Implementieren Sie eine Zeitüberschreitung in BluetoothSocket inputstream.read() in Android

Ich habe versucht mit Thread.sleep(), aber das pausiert nur meine Aktivität.

--- --- Aktualisierung

hatte ich eine Idee, machen 2 Thread-Code herereads (t1 & t2), wobei jeder Thread Interrupt andere, einer von ihnen (t1) machen einen Schlaf (5000), dann unterbrechen der andere Thread (t2), von der anderen Seite der andere Thread (t2) wenn gelesen der Eingangsstrom erkennt ein Zeichen als 0x0D unterbricht den anderen Thread (t1), aber hier ist meine Frage, kann mir jemand helfen? weil ich nicht Interrupt() -Methode von Threads verwendet haben, ich hoffe, jemand kann mir helfen, danke ...

--- --- Aktualisierung



     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(); 
      } 
     } 
    } 

Dies ist meine Implementierung, wenn etwas kommt In einem anderen Thread ist das Problem, dass das Timeout erreicht wird, wenn ich das 0x3e-Zeichen von de mmInStream nicht bekomme.

Ich vermutete, dass ich im zweiten Beispiel eine notifyAll() verwenden muss, aber wann muss ich readThread() starten?

Danke, @weeman

+0

Soweit die API geht, habe ich keine Methode gefunden, die das tut ... Vielleicht gibt es eine reflektierende Möglichkeit, es zu tun ...!? – TacB0sS

+0

Sowohl Bluetooth Socket als auch Inputstream haben keine Methode, um ein Timeout zu implementieren. Das ist mein Problem, das ich mit Threads und Handlern versucht habe, aber noch nicht implementiert werden konnte ... Danke für Ihre Antwort –

+0

Zum Unterdrücken von Leerzeichen in einem String können Sie "Trim()" anstelle von "replaceAll (" "," ")" –

Antwort

10

Sie so etwas tun könnte:

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); 

Auf diese Weise können der Lage sind, zunächst von einem Strom mit einem bestimmten Timeout lesen. Wenn u wollen Sie einen Timeout jederzeit implementieren des Lesens kann so etwas wie dies versuchen:

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) {} 

mit diesem können Sie eine Art von Event-Handler benötigen, um Ihre Anwendung zu benachrichtigen, wenn der Thread tatsächlich etwas aus dem Eingangsstrom gelesen .

Ich hoffe, dass hilft!

---- edit:

ich ein Beispiel implementiert, ohne Handler zu verwenden.

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

Sehr schöne Timeouts-Implementierung, aber ich bekomme es nicht, damit es in meinem Code funktioniert Ich habe meine Antwort aktualisiert, wenn Sie mir eine Hand geben können ... Danke ... übrigens Sie setzen,

 byte[available] read=new byte[available] 
und ist
 byte[] read=new byte[available]; 

+0

oh, ja. Du hast recht. Ich werde das ändern und versuchen, Ihre aktualisierte Frage zu beantworten. – Weeman

+0

Danke @weeman nach dem Lesen des Codes Ich verstehe, wie dieses Timeout funktioniert und ich könnte eines implementieren, wenn ich keine Antwort von meinem Mikrocontroller erhielt, danke ... –

Verwandte Themen