Thread para capturar un tiempo de espera de InputStream.read () BluetoothSocket

He estado utilizando InputStream.read( byte[] b, int off, int len ) método para leer en los datos, pero ahora se han ejecutado en un problema de tiempo de espera. A veces espero que los tiempos de espera de la lectura, y debe tener el programa de ajuste en consecuencia después de un tiempo de espera. He intentado implementar un hilo, pero realmente no sé nada sobre hilos y no puedo conseguir que funcione. También quiero añadir que este hilo se está inicializando dentro de otro hilo . No estoy seguro de cuáles son las implicaciones de esto, pero puede causar un problema.

Mi código inicial había funcionado para la mayoría de las veces que necesito leer, pero cada vez que estoy esperando un tiempo de espera, mi programa se bloquea en la llamada read() y nunca se agota. Cuando implementé este nuevo código, los tiempos en los que mi código inicial funcionaba ahora se agotaban. Yo uso Thread.wait(500) que supongo es 500 milisegundos, pero no puedo encontrar ningún Javadocs incluyendo la función wait() . Aquí y aquí .

Otros puestos relacionados con este: 1 , 2 , 3 .

También he mirado en la declaración de un tiempo de espera para el BluetoothSocket , pero no puedo encontrarlo en cualquier parte de la documentación .

Aquí es cómo se ve mi código inicial:

 public void run(int length) throws IOException { buffer = new byte[1024]; try { bytes = mmInStream.read(buffer, 0, length); mHandler.obtainMessage(MainMenu.MESSAGE_READ, bytes, -1, buffer) .sendToTarget(); } catch (IOException e) { Message msg = mHandler.obtainMessage(MainMenu.MESSAGE_TOAST); Bundle bundle = new Bundle(); bundle.putString( TOAST, "Device has disconnected from the Bluetooth Module." ); msg.setData(bundle); mHandler.sendMessage(msg); connectionLost(); BluetoothService.this.start(); } 

Esto es lo que he intentado implementar:

 public void run(int length) throws IOException { buffer = new byte[1024]; length1 = length; Thread myThread = new Thread(new Runnable() { public void run() { try { bytes = mmInStream.read( buffer, 0, length1 ); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); synchronized (myThread) { myThread.start(); try { myThread.wait(500); if(myThread.isAlive()) { mmInStream.close(); Log.i( "InStream", "Timeout exceeded!"); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { myThread.run(); mHandler.obtainMessage(MainMenu.MESSAGE_READ, bytes, -1, buffer) .sendToTarget(); } catch (IOException e) { Message msg = mHandler.obtainMessage(MainMenu.MESSAGE_TOAST); Bundle bundle = new Bundle(); bundle.putString( TOAST, "Device has disconnected from the Bluetooth Module." ); msg.setData(bundle); mHandler.sendMessage(msg); connectionLost(); BluetoothService.this.start(); } 

EDITAR:

Así que estoy tratando de recrear

 buffer = new byte[1024]; bytes = mmInStream.read(buffer, 0, length); 

He hecho lo siguiente:

 Scanner scan = new Scanner(new InputStreamReader(mmInStream)); String readIn; try { readIn = scan.next(); bytes = 5; // I tried with or without this, since I do not think it matters... buffer = readIn.getBytes( Charset.forName( "US-ASCII" ) ); } 

Más adelante en mi código hago esta llamada …. Lo siento editar de nuevo, la llamada buf=read( 5 ) va a lo que se muestra arriba.

 byte[] buf = buffer; write( a ); buf = read( 5 ); Log.i(TAG, "Before buf[5]" ); try { buf[5] = '\0'; } catch( NullPointerException e ) { return false; } 

Cuando utilizo el método original, pasa este buf[5] llamada fino. Pero cuando uso el nuevo método, me da un IndexOutOfBoundsException en ese punto. ¿Me estoy perdiendo de algo? La entrada esperada debe ser CMD\r\n

El ejemplo de chat bluetooth es muy pobre en este sentido, debe utilizar un escáner de entrada en lugar de mmInStream.read. Esto es lo que uso y funciona razonablemente bien …

Para su caso de uso, omita todo el búfer y el byte y escriba y lea (no necesita usar ninguno de esos cuando está usando un escáner y un lector de entradas como aquellos que manejan esa información para usted) … en otras palabras, el siguiente código se encarga De todo eso por ti. Cambié el delimitador por usted a CRLF. Lo que el código de abajo es enviar una cadena y lo escribe y luego lee. Si no necesita enviar nada al dispositivo remoto, empiece con scan = new Scanner. Cada vez que se lee una línea y termina con \ r \ n, la almacenará en el string instring.

Así que si quieres enviar "a", escribirías

 String readIn = beginListenForData("a"); 

El a se enviará bajo el mmOutStream y luego el escáner leerá el mmInStream y recogerá todos los caracteres, luego una vez que vea un CRLF devolverá los caracteres que lee y devolverlos en su cadena readIn. ¿Tener sentido?

 private String beginListenForData(String msg0) { msg0 += "\r"; //this adds a return character to the string, you can omit this if you just send an a and the remote device understands what that means. String instring = ""; try { mmOutStream.write(msg0.getBytes()); } catch (IOException ex) { stop(); } scan = new Scanner(new InputStreamReader(mmInStream)); scan.useDelimiter(Pattern.compile("[\\r\\n]+")); instring = scan.next(); scan = null; return instring; } 
  • ¿Debería o no debería utilizarse AsyncTask para operaciones de larga duración?
  • La mejor manera de enviar solicitudes HTTP GET ansynchronously en Android?
  • Enviar tareas a un grupo de subprocesos proporciona RejectedExecutionException
  • Mi clase AsyncTask tiene otros subprocesos en él. ¿Cómo puedo esperar a que termine con todos sus subprocesos antes de ejecutar un método siguiente?
  • Android esperando el hilo de la interfaz de usuario
  • Cómo reiniciar un hilo en Android?
  • Android ejecuta una función en una clase en un nuevo hilo
  • Android- Thread.join () hace que la aplicación se bloquee
  • ¿Los hilos se eliminan automáticamente después de que el método run () sale en Java?
  • Cómo pausar / reanudar el hilo en Android?
  • ¿Puede alguien ayudarme a entender el enhebrado de mi programa?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.