2012-05-09 11 views
9

¿Es posible implementar un tiempo de espera en una función de inputstream.read() desde un BluetoothSocket en Android?Implementar un tiempo de espera en BluetoothSocket inputstream.read() en Android

He intentado utilizar Thread.sleep() pero esto solo detiene mi actividad.

--- Actualización ---

tuve una idea, hacer 2 herereads código hilo (t1 & t2), donde cada hilo de interrupción otro, uno de ellos (t1) hacen un sueño (5000) y luego interrumpir el otro hilo (t2), del otro lado el otro hilo (t2) si en lectura el inputstream detecta algún carácter como 0x0D interrumpe el otro hilo (t1), pero aquí está mi pregunta, ¿alguien puede ayudarme? porque no usamos el método de interrupción() de hilos, espero que alguien me puede ayudar, gracias ...

--- Actualización ---



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

Ésta es mi aplicación cuando viene algo en un subproceso diferente, el problema es que se alcanzará el tiempo de espera si no obtengo el carácter 0x3e de mmInStream.

Supongo que en el segundo ejemplo debo usar un notifyAll(), pero, ¿cuándo tengo que iniciar readThread()?

Gracias, @weeman

+0

Por lo que respecta a la API, no encontré un método que lo haga ... ¿¡Quizás haya alguna manera reflexiva de hacerlo ...!? – TacB0sS

+0

Tanto el zócalo Bluetooth como el flujo de entrada no tienen ningún método para implementar un tiempo de espera excedido. Ese es mi problema, lo he intentado con Threads y manipuladores, pero no pude implementarlo todavía ... Gracias por su respuesta –

+0

Para suprimir espacios en una cadena, puede usar "Trim()" en lugar de "replaceAll (" "," ")" –

Respuesta

10

Se podría hacer algo como esto:

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

este modo, son capaces de leer inicialmente a partir de una corriente con un tiempo de espera específico. Si quieres poner en práctica un tiempo de espera en cualquier momento de la lectura que se puede intentar algo como esto:

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

usando esto usted puede necesitar algún tipo de controlador de eventos para notificar a la aplicación si el hilo lee realmente algo del flujo de entrada .

Espero que ayude!

---- edición:

he implementado un ejemplo sin necesidad de utilizar ningún controlador.

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

Muy buena implementación de tiempos de espera, pero no entiendo para que funcione en mi código actualicé mi respuesta si puedes darme una mano ... Gracias ... por la forma en que lo pones,

 byte[available] read=new byte[available] 
y es
 byte[] read=new byte[available]; 

+0

oh, sí. Tienes razón. Voy a cambiar eso y tratar de dar una respuesta a su pregunta actualizada. – Weeman

+0

Gracias @weeman después de leer el código Entiendo cómo funciona este tiempo de espera y podría implementar uno si no recibí respuesta de mi microcontrolador, gracias ... –

Cuestiones relacionadas