2012-05-09 35 views
9

Có thể thực hiện thời gian chờ trong một hàm inputstream.read() từ BluetoothSocket trong Android không?Thực hiện một thời gian chờ trong BluetoothSocket inputstream.read() trong Android

Tôi đã thử sử dụng Thread.sleep() nhưng điều này chỉ tạm dừng hoạt động của tôi.

--- Update ---

Tôi đã có một ý tưởng, làm cho 2 herereads đang ren (t1 & t2), nơi mỗi thread ngắt khác, một trong số họ (t1) làm một giấc ngủ (5000) sau đó gián đoạn các chủ đề khác (t2), từ phía bên kia thread khác (t2) nếu đọc inputstream phát hiện một số ký tự như 0x0D làm gián đoạn thread khác (t1), nhưng đây là câu hỏi của tôi, không ai có thể giúp tôi? bởi vì tôi đã không sử dụng ngắt() của chủ đề, tôi hy vọng ai đó có thể giúp tôi, cảm ơn bạn ...

--- Update ---



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

Đây là triển khai thực hiện của tôi khi một cái gì đó đi trong một chủ đề khác nhau, vấn đề là thời gian chờ sẽ đạt được nếu tôi không nhận được các ký tự 0x3e từ mmInStream.

Tôi cho rằng trong ví dụ thứ hai, tôi phải sử dụng notifyAll(), nhưng, khi nào tôi phải bắt đầu readThread()?

Cảm ơn bạn, @weeman

+0

Theo như API đi, tôi đã không gặp phải phương thức thực hiện điều đó ... Có lẽ có một số cách phản chiếu để làm điều đó ...!? – TacB0sS

+0

Cả hai Socket Bluetooth và inputstream không có bất kỳ phương pháp để thực hiện một thời gian chờ. Đó là vấn đề của tôi tôi đã thử với Chủ đề và xử lý nhưng không thể được thực hiện được nêu ra ... Cảm ơn câu trả lời của bạn –

+0

Để ngăn chặn không gian trong một chuỗi, bạn có thể sử dụng "Trim()" thay vì "replaceAll (" "," ")" –

Trả lời

10

Bạn có thể làm một cái gì đó như thế này:

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

Bằng cách này bạn có thể bước đầu đọc từ một dòng với một thời gian chờ cụ thể. Nếu u muốn thực hiện một thời gian chờ tại bất kỳ thời điểm đọc bạn có thể thử một cái gì đó như thế này:

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

sử dụng bạn này có thể cần một số loại xử lý sự kiện thông báo cho ứng dụng của bạn nếu thread thực sự đọc một cái gì đó từ dòng đầu vào .

Tôi hy vọng điều đó sẽ hữu ích!

---- chỉnh sửa:

Tôi đã triển khai một ví dụ không sử dụng bất kỳ trình xử lý nào.

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

Rất tốt đẹp thời gian chờ thực hiện nhưng tôi không nhận được nó để làm cho nó hoạt động trong mã của tôi ... Điện thoại bởi cách bạn đặt,

 byte[available] read=new byte[available] 
và là
 byte[] read=new byte[available]; 

+0

oh, có. Bạn đúng rồi. Tôi sẽ thay đổi điều đó và cố gắng đưa ra câu trả lời cho câu hỏi được cập nhật của bạn. – Weeman

+0

Cảm ơn @ weeman sau khi đọc mã Tôi hiểu làm thế nào thời gian chờ này hoạt động và tôi có thể thực hiện một nếu tôi không nhận được phản hồi từ vi điều khiển của tôi, cảm ơn ... –

Các vấn đề liên quan