我使用下面的代码在一段时间间隔之后每次完成一些工作,并在最后使用后延迟' runnable的子句和oustide。这是代码。
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
// do somthing
} catch (Exception e) {
// TODO: handle exception
} finally {
handler.postDelayed(this, 60000);
}
}
};
handler.postDelayed(runnable, 60000);
handler.postDelayed(runnable, 60000);
将运行两次或一次。
答案 0 :(得分:2)
每个try / catch / finally块如何正常或突然完成?
finally块"始终 ^ " try块退出时执行
这确保即使发生意外异常也会执行finally块。
上面的^ 异常 - 如果jvm退出或线程被杀,最终可能无法执行
有关详细信息,请参阅java规范:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2
Handler post / postDelayed方法如何执行?还是失败了?由于某种原因 - 第二种情况可能发生,如果消息没有放入消息队列 - 失败时,通常是因为处理消息队列的循环器正在退出。
但很可能你的陈述会进行INFINITE循环
** ps。你需要在try块中抛出异常或者删除catch块(因为try {} finally {})可以存在"没有" catch但catch块中的代码没有上升任何异常会使编译器抱怨(代码将无法编译)
如果你想循环n次+ 1 你需要在runnable run()方法中的postDelayed之前添加一些条件
在您的案例代码流执行中:
所以我应该删除run()方法的最后一个postDelay,以实现postDelay在一个循环中只运行一个。 - AndroidMob
你可以这样写:
final Handler handler = new Handler();
handler.post(new Runnable() {
// this int will also be passed to method post delayed
// as "this" keyword applies to Anonymous Class
// which body contains everything between brackets of new Runnable() { ... }
int withThis = 1;
@Override
public void run() {
handler.postDelayed(this,1000);
}
});
所以我应该在哪里调用方法来完成某事?在run()方法..? - AndroidMob
这也取决于你想要实现的目标:
示例
handler.post(new Runnable() {
int counter = 0;
@Override
public void run() {
boolean wasPlacedInQue = false;
doPreMethod();
if(counter =< 10) {
doMethod();
wasPlacedInQue = handler.postDelayed(this,1000);
}
if(wasPlacedInQue) {
counter++;
doPostyMethod();
} else doFailureMethod();
}
run()方法中的代码在所谓的UI线程上同步执行 - 我执行你的应用程序的主线程见:
https://developer.android.com/training/multiple-threads/communicate-ui.html
如果您有兴趣学习它,我已经为您做了一个完整的工作示例:
https://gist.github.com/c3ph3us/7d237d540e60597369856cb1fa652a23
答案 1 :(得分:-1)