Android 如果我使用try-catch和finally-for处理程序使用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) {

我使用下面的代码在一段时间间隔后每次都完成一些工作,并在'finally'子句中使用post delay和outtide of runnable。这是代码

    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-查看我的编辑如果您接受答案,并且如果答案符合您的问题(我的答案的左上角),则进行投票也会很好