2016-08-18 3 views
1

Есть ли способ запустить обработчик внутри цикла? У меня есть этот код, но не работает, так как не ждать цикла, но выполняет код правильный путь:Android postDelayed Handler Inside for For Loop?

final Handler handler = new Handler(); 


     final Runnable runnable = new Runnable() { 
      public void run() { 

       // need to do tasks on the UI thread 
       Log.d(TAG, "runn test"); 

       // 
       for (int i = 1; i < 6; i++) { 

        handler.postDelayed(this, 5000); 

       } 


      } 
     }; 

     // trigger first time 
     handler.postDelayed(runnable, 0); 

Конечно, когда я двигаю пост замедленное вне работы цикла, но это не перебирать, ни выполнить времена мне нужно:

final Handler handler = new Handler(); 


     final Runnable runnable = new Runnable() { 
      public void run() { 

       // need to do tasks on the UI thread 
       Log.d(TAG, "runn test"); 

       // 
       for (int i = 1; i < 6; i++) { 
       } 

       // works great! but it does not do what we need 
       handler.postDelayed(this, 5000); 


      } 
     }; 

     // trigger first time 
     handler.postDelayed(runnable, 0); 

РЕШЕНИЕ НАЙДЕНО:

мне нужно использовать asyntask вместе с Thread.sleep (5000) в методе doInBackground:

class ExecuteAsyncTask extends AsyncTask<Object, Void, String> { 


      // 
      protected String doInBackground(Object... task_idx) { 

       // 
       String param = (String) task_idx[0]; 

       // 
       Log.d(TAG, "xxx - iter value started task idx: " + param); 

       // stop 
       try { 
        Thread.sleep(5000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       // 
       Log.d(TAG, "xxx - iter value done " + param); 
       return " done for task idx: " + param; 
      } 


      // 
      protected void onPostExecute(String result) { 
       Log.d(TAG, "xxx - task executed update ui controls: " + result); 
      } 

     } 




     for(int i = 0; i < 6; i ++){ 

      // 
      new ExecuteAsyncTask().execute(String.valueOf(i)); 

     } 
+0

, если вы звоните 'postDelayed' N раз' Runnable' будет работать N раз, не правда ли то, что вы хотите? – pskink

+0

Да, но он не ждет и сразу вызывает код, который мне не нужен –

+0

измените '5000' на' 5000 + i * 1000', поэтому первый «Runnable» будет запущен через 5 секунд, второй после 6 сек и т. д. ... 7, 8, 9, ... – pskink

ответ

8

Следующий код должен это сделать:

final Handler handler = new Handler(); 


     int count = 0; 
     final Runnable runnable = new Runnable() { 
      public void run() { 

       // need to do tasks on the UI thread 
       Log.d(TAG, "runn test"); 


       if (count++ < 5) 
        handler.postDelayed(this, 5000); 

      } 
     }; 

     // trigger first time 
     handler.post(runnable); 
+0

Почему downvote (я тоже пытаюсь учиться)? – Shaishav

+0

При выполнении if (count ++ <6) это фактически увеличивает значение счета на единицу? Или это как если (count + 1 <6)? – DAVIDBALAS1

+0

@ DAVIDBALAS1 Он сравнивает текущее значение с 6 и затем увеличит значение для следующей итерации – Shaishav