2015-06-01 2 views
0

Мое приложение работает с несколькими фотографиями. Я хочу взять новую за каждые несколько секунд и добавить ее к фотографиям, с которыми я работаю. Поэтому я написал этот код, используя собственный поток для ожидания, поэтому ui не замерзнет.Android: пользовательский интерфейс зависает, хотя использование Handler и postdelay

Handler handler = new Handler(); 
int time = 500; 
for (int cnt = 10000; cnt > 0; cnt -= time) { 
    // Execute the code in run after time [ms] passed 
    handler.postDelayed(new Runnable() { 
     public void run() { 
      mainTask(); 
     } 
    }, time); 
} 

Почему мой ui замерзает до окончания цикла for? Обычно показанные снимки должны быть обновлены в mainTask()

Спасибо за помощь!

[EDIT]

Он работает в настоящее время, я создал класс, который реализует Runnable и пусть он называет себя:

  Handler handler = new Handler(); 
      class DelayedTask implements Runnable { 
       int cnt, time; 
       Handler handler; 
       DelayedTask(int c, int t, Handler h) {cnt=c; time=t; handler=h;} 
       public void run() { 
        mainTask(); 
        if (cnt > 0) { 
         cnt -= time; 
         handler.postDelayed(new DelayedTask(cnt, time, handler), time); 
        } 
       } 
      } 
      handler.postDelayed(new DelayedTask(cnt,time,handler), time); 
+0

Вы уверены, что не используете этот код в потоке пользовательского интерфейса? При вызове нового обработчика() в потоке без привязки петлителя возникнет исключение. –

ответ

1

Вы планирования 10000/500 Runnable сек в очень короткое время, все стрельбы после 500 мс, в то же время. Это, вероятно, не то, что вы хотите.

Вместо этого, вы хотите запланировать следующий Runnable когда ток Runnable пожаров:

handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
    mainTask(); 

    if(someCondition) { 
     handler.postDelayed(this, 500); 
    } 
    } 
}, 500); 

Теперь mainTask будет срабатывать каждый 500мс ~.

+0

Спасибо. Думаю, теперь я понимаю концепцию лучше. – Jonas

0

Я не слишком уверен, но я думаю, что обработчик идет как это:

Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      mainTask(); 
      handler.postDelayed(this, interval); 
     } 
    }, interval); 
Смежные вопросы