Android:UI 虽然使用了 Handler 和 postdelayed,但仍然冻结

Android: UI freezes although use of Handler and postdelay

我的应用程序可以处理几张图片。我想每隔几秒钟拍一张新的,并将其添加到我使用的照片中。所以我写了这段代码,在等待时间使用自己的线程,所以 ui 不会冻结。

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

感谢您的帮助!

[编辑]

它现在可以工作了,我创建了一个实现 Runnable 的 class 并让它调用自己:

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

我不太确定,但我认为处理程序是这样的:

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            mainTask();
            handler.postDelayed(this, interval);
        }
    }, interval);

您要在 非常 的短时间内安排 10000/500 Runnable 秒,全部在 500 毫秒后同时触发。这可能不是你想要的。

相反,您想在当前 Runnable 触发时安排下一个 Runnable

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

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

现在,mainTask 将每 ~500 毫秒触发一次。