Внедрить таймаут в BluetoothSocket inputstream.read () в Android

Возможно ли реализовать тайм-аут в функции inputstream.read () из BluetoothSocket в Android?

Я попытался использовать Thread.sleep (), но это только приостанавливает мою работу.

—Обновить—

У меня была идея, сделайте 2 потока кода herereads (t1 & t2), где каждый поток прерывает другой, один из них (t1) выполняет спящий режим (5000), затем прерывает другой поток (t2), с другой стороны – другой поток ( T2), если при чтении входной поток обнаруживает какой-либо символ, поскольку 0x0D прерывает другой поток (t1), но вот мой вопрос, может ли кто-нибудь мне помочь? Потому что я не использовал метод прерываний () потоков, надеюсь, кто-то может мне помочь, спасибо …

—Обновить—

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

Это моя реализация, когда что-то приходит в другой поток, проблема в том, что таймаут будет достигнут, если я не получу символ 0x3e из mmInStream.

Я предположил, что во втором примере я должен использовать notifyAll (), но когда мне нужно запустить readThread ()?

Спасибо, @weeman

Solutions Collecting From Web of "Внедрить таймаут в BluetoothSocket inputstream.read () в Android"

Вы могли бы сделать что-то вроде этого:

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

С помощью этого вам может понадобиться какой-то обработчик событий для уведомления вашего приложения, если поток действительно прочитал что-то из входного потока.

Надеюсь, это поможет!

—-редактировать:

Я применил пример без использования обработчиков.

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