2012-05-09 9 views
9

Czy jest możliwe wprowadzenie limitu czasu w funkcji inputstream.read() z BluetoothSocket w systemie Android?Wprowadzić limit czasu w BluetoothSocket inputstream.read() w Androidzie

Próbowałem używać Thread.sleep(), ale to tylko wstrzymuje moją aktywność.

--- Aktualizacja ---

miałem pomysł, zrobić 2 herereads kod gwint (t1 & T2), gdzie każdy wątek przerwania innego, jeden z nich (t1) Czy sen (5000), a następnie przerwać drugi wątek (t2), z drugiej strony drugi wątek (t2), jeśli wczytywany strumień wejściowy wykrywa jakiś znak, ponieważ 0x0D przerywa drugi wątek (t1), ale oto jest moje pytanie, czy ktoś może mi pomóc? bo nie używać przerwań() metoda wątków, mam nadzieję, że ktoś może mi pomóc, dziękuję ...

--- Aktualizacja ---



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

To moja implementacja gdy coś przychodzi w innym wątku, problem polega na tym, że limit czasu zostanie osiągnięty, jeśli nie otrzymam znaku 0x3e z de mmInStream.

Przypuszczam, że w drugim przykładzie muszę użyć funkcji notifyAll(), ale kiedy muszę uruchomić readThread()?

Dziękuję @weeman

+0

Jeśli chodzi o API idzie, nie napotka metodę, która robi ... Być może istnieje jakiś refleksyjny sposób to zrobić ...!? – TacB0sS

+0

Zarówno gniazdo Bluetooth, jak i wejście nie mają żadnej metody implementacji limitu czasu. To jest mój problem próbowałem z wątków i obsługi, ale nie można jeszcze uzyskać zaimplementowane ... Dzięki za odpowiedź –

+0

Do tłumienia spacji w ciągu można użyć "Trim()" zamiast "replaceAll (" "," ")" –

Odpowiedz

10

Można zrobić coś takiego:

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

ten sposób jesteś w stanie początkowo czytać ze strumienia z określonego limitu czasu. Jeśli u chcą wprowadzić limit czasu w dowolnym czasie czytania można spróbować coś takiego:

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

stosując to, że mogą potrzebować jakiegoś obsługi zdarzeń do powiadamiania aplikacji jeśli wątek rzeczywiście przeczytać coś ze strumienia wejściowego .

Mam nadzieję, że to pomoże!

---- edit:

I wdrożone przykład bez użycia ładowarki.

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

Bardzo dobra implementacja limitu czasu, ale nie dostaję go, aby działał w moim kodzie. Zaktualizowałem moją odpowiedź, jeśli możesz mi pomóc ... Dzięki ... przy okazji, jak je wstawisz,

 byte[available] read=new byte[available] 
i jest to
 byte[] read=new byte[available]; 

+0

o tak. Masz rację. Zamierzam to zmienić i spróbować odpowiedzieć na twoje zaktualizowane pytanie. – Weeman

+0

Dzięki @weeman po przeczytaniu kodu Rozumiem, jak działa ten timeout i mogę go wdrożyć, jeśli nie otrzymałem odpowiedzi z mojego mikrokontrolera, dziękuję ... –