如果我使用try catch并最终使用runnable处理程序会发生什么?

时间:2016-06-22 03:09:03

标签: android android-service android-handler

我使用下面的代码在一段时间间隔之后每次完成一些工作,并在最后使用后延迟' 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);将运行两次或一次。

2 个答案:

答案 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之前添加一些条件

在您的案例代码流执行中

  1. postnlayed方法从runnable定义之外的最后一行
  2. 执行runnable:
    • 尝试阻止的开始
    • 有或没有通过捕获
    • 通过在runnable run()方法中使用postDelayed终止块 - 将在消息队列中运行runnable以在主线程上延迟执行
  3. 然后无限循环2
  4.   

    所以我应该删除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)

肯定会跑两次。因为它们是两个不同的消息,处理程序将分别处理它们。