2013-11-07 4 views
0

У меня есть AsyncTask, который содержит следующий doInBackground() метод:`while` петля внутри AsyncTask повторение

protected Boolean doInBackground(String... StringUrls) { 

     // ... 

      while (len != -1) { 

       bufOutstream.write(buffer, 0, len); 
       len = in.read(buffer); 

       if (Recorder.this.isCancelled) { 

       Recorder.this.stopSelf(); 
        break; 
       } 

      } 


      bufOutstream.close(); 

     } catch (IOException e) { 
      System.err.println("Caught IOException: " + e.getMessage()); 


     } 


     return true; 
    } 

я хотел бы сделать следующее:

  • Когда цикл while делается (потому что len == -1) Я хотел бы подождать 1 секунду, а затем повторить попытку, так что если len изменится на len != -1, он будет снова зациклен.
  • Эта попытка повторения должна быть выполнена до 5 раз (когда len == -1), когда len != -1 повторная попытка должна быть остановлена.

ответ

0

Итак, вы хотите, чтобы читать и писать, но когда нет ничего, чтобы читать вы хотите повторить 5 раз с интервалом в 1 секунду и отказаться после того, как прошло 5 секунд (повторных попыток)?

boolean retry=true; 
while(retry) { 
    retry = false; 
    while(len != -1) { 
     bufOutstream.write(buffer, 0, len); 
     len = in.read(buffer); 
     if (Recorder.this.isCancelled){ 
      Recorder.this.stopSelf(); 
       break; 
     } 
    } 

    for(int i=0; i<5; ++i) { 
     synchronized(this) { 
      try{ 
       wait(1000); 
      } catch (InterruptedException){} 
     } 

     len = in.read(buffer); 
     if(len!=-1) { 
      retry = true; 
      break; 
     } 
    } 
} 
+0

Спасибо. Не могли бы вы также сказать, что делать, когда вызывается «IOException» (из-за разъединения)? Это прерывает ваш цикл. – Kristopher

+0

Это зависит от вас. Вы можете просто проигнорировать его и повторить запрос (5 ​​раз), но иногда требуется некоторое время до того, как будет сброшено IOException. Особенно в случаях «SocketTimeoutException». Другой вариант - повторить 1 или 2 раза вместо 5, когда возникает исключение. Вы также можете попытаться реализовать какое-то экспоненциальное отключение или даже немедленно прервать задачу. Это зависит от того, насколько важны данные для вашего приложения. – stan0

0
protected Boolean doInBackground(String... StringUrls) { 

     for (int i = 0; i < 5; i++) { 
     try { 
      while (len != -1) { 
       bufOutstream.write(buffer, 0, len); 
       len = in.read(buffer); 
       if (Recorder.this.isCancelled) { 
        Recorder.this.stopSelf(); 
        break; 
       } 
      } 
      bufOutstream.close(); 
     } catch (IOException e) { 
      System.err.println("Caught IOException: " + e.getMessage()); 
     } 
     TimeUnit.SECONDS.sleep(1); 
     } 
     return true; 
    } 
Смежные вопросы