2012-05-09 12 views
9

Android'de bir BluetoothSocket'den bir inputstream.read() işlevinde zaman aşımı uygulamak mümkün mü?Android'de BluetoothSocket inputstream.read() öğesinde bir zaman aşımı gerçekleştirin

Thread.sleep() kullanmayı denedim, ancak bu yalnızca etkinliğimi duraklatıyor.

--- Güncelleme --- Ben bir fikir geldi

, diğer, bunlardan biri (t1) kesme her iş parçacığı bir uyku (5000) do 2 iplik kod herereads (t1 & t2) sonra kesme yapmak diğer iplikten (t2), diğer taraftan (t2), eğer girişte bir başka karakter (t2) okunursa, bir başka karakteri 0x0D olarak algılar ve diğer ipi (t1) keser, ama burada benim sorum, kimsenin bana yardım edemez mi? i parçacığı kesme() yöntemini kullanın çünkü ben

--- Güncelleme --- Bu benim uygulaması



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

bir şey gelince ... teşekkür ederim, birisi bana yardımcı olabilir umut Farklı bir iş parçacığında, sorun, de mmInStream gelen 0x3e karakteri almazsanız zaman aşımı ulaşılacak olmasıdır.

İkinci örnekte notifyAll() kullanmalıyım, ancak readThread() işlevini ne zaman başlatmalıyım?

+0

API devam ettiği sürece, bunu yapan bir yöntemle karşılaşmadım ... Belki de bunu yapmak için bazı yansıtıcı yollar vardır ...!? – TacB0sS

+0

Hem Bluetooth Socket hem de inputstream'in zaman aşımı uygulamak için herhangi bir yöntemi yoktur. Bu benim sorunum Threads ve işleyicileri ile denedim ama henüz uygulanamadı ... Yanıtınız için teşekkürler –

+0

Bir dizede boşlukları bastırmak için "replaceAll (" "," yerine "Trim()" kullanabilirsiniz ")" –

cevap

10

@weeman Böyle bir şey yapabileceğini, teşekkür ederim:

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

başlangıçta belirli bir zaman aşımı ile bir akıştan okuyabilir Bu şekilde. İplik aslında giriş akımından şey okursanız başvurunuzu bildirmek için olay işleyicisi çeşit gerekebilir bu size kullanarak

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

: u böyle bir şey deneyebilirsiniz sizi okumaya herhangi bir saatinde bir zaman aşımı uygulamak istiyorsanız .

Bunu umut olur!

---- düzenleme:

herhangi işleyicileri kullanmadan bir örnek uyguladı.

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

Çok güzel zaman aşımı uygulama ama, içerde arada ... teşekkürler ... bana yardım edebilir eğer benim cevap güncelledik benim kodunda çalışması için bunu anlamıyorum

 byte[available] read=new byte[available] 
ve
 byte[] read=new byte[available]; 

+0

oh, yes. Haklısın. Bunu değiştireceğim ve güncellenmiş soruya bir cevap vermeye çalışacağım. – Weeman

+0

Teşekkürler @weeman kodu okuduktan sonra bu zaman aşımının nasıl çalıştığını anlıyorum ve mikrodenetleyicimden yanıt alamadım eğer bir tane uygulayabilirim, teşekkürler ... –