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 毫秒触发一次。
我的应用程序可以处理几张图片。我想每隔几秒钟拍一张新的,并将其添加到我使用的照片中。所以我写了这段代码,在等待时间使用自己的线程,所以 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 毫秒触发一次。