Android 如果我使用try-catch和finally-for处理程序使用runnable,会发生什么?
我使用下面的代码在一段时间间隔后每次都完成一些工作,并在'finally'子句中使用post delay和outtide of runnable。这是代码Android 如果我使用try-catch和finally-for处理程序使用runnable,会发生什么?,android,android-service,android-handler,Android,Android Service,Android Handler,我使用下面的代码在一段时间间隔后每次都完成一些工作,并在'finally'子句中使用post delay和outtide of runnable。这是代码 Runnable runnable = new Runnable() { @Override public void run() { try { // do somthing } catch (Exception e) {
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)代码>将运行两次或一次。它肯定会运行两次。因为它们是两条不同的消息,处理程序将分别处理它们。视情况而定
- 第一件事
每个try/catch/finally块如何正常或突然完成
当try块退出时,执行finally块“always^”
这确保即使发生意外异常,也会执行finally块
^上述异常-如果jvm退出或线程被终止,可能不会执行finally
有关详细信息,请参见java规范:
- 第二件事
处理程序post/postDelayed方法将如何执行?还是失败了?由于某种原因,如果消息未放入消息队列中,则第二种情况可能会发生,这通常是因为处理消息队列的循环器正在退出
但最有可能的是,您的语句将形成一个无限循环
**另外,您需要在try块中抛出一个异常或删除catch块(因为try{}finally{})可以在“没有”catch的情况下存在,但是catch块中的代码没有引发任何异常都会使编译器抱怨(代码不会编译)
如果希望循环n次+1,则需要在Runnable run()方法中的postDelayed之前添加一些条件
在您的情况下,代码流执行:
从runnable定义之外的最后一行开始的postDelayed方法
通过以下方式执行runnable:
- 试块开始
- 带或不带传球接球
- 在runnable run()方法中使用postDelayed完成finally块-它将在消息que中放置runnable,以在主线程上延迟执行
然后在2上无限循环
因此,我是否应该删除run()方法的最后一个postDelay out side,以在一个循环中实现postDelay只运行一个安德洛依德莫布
您可以这样写:
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()方法中..?-安德洛依德莫布
这还取决于您想要实现的目标:
范例
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();
}
handler.post(新的Runnable(){
int计数器=0;
@凌驾
公开募捐{
布尔值wasPlacedInQue=false;
doPreMethod();
如果(计数器=<10){
doMethod();
wasPlacedInQue=handler.postDelayed(这是1000);
}
如果(wasPlacedInQue){
计数器++;
doPostyMethod();
}else doFailureMethod();
}
run()方法中的代码在所谓的UI线程上同步执行,即执行应用程序的主线程。请参见:
如果您有兴趣进一步研究,我为您提供了一个完整的工作示例:
所以我应该删除run()方法的最后一个postDelay out-side以实现postDelay只在一个循环中运行一个。是的,我想用…无限循环来运行它。那么我应该在哪里调用方法来完成某件事呢?in run()方法..?handler.post(新Runnable(){@Override public void run(){mymethod());handler.postDelayed(this,30000);}}});@AndroidMob-查看我的编辑如果您接受答案,并且如果答案符合您的问题(我的答案的左上角),则进行投票也会很好