如果我使用 try catch 和 finally for handler 使用 runnable 会发生什么?

What will happen if I use try catch and finally for handler using runnable?

我使用下面的代码在一段时间间隔后每次完成一些工作,并在 'finally' 子句中使用 post 延迟并取消 运行nable。这是代码。

    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 块如何正常或突然完成?

the finally block "always ^" executes when the try block exits

这确保即使发生意外异常也能执行 finally 块。

^ 上面的异常 - 如果 jvm 退出或线程被杀死,finally 可能不会执行

有关详细信息,请参阅 java 规格:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.2

  • 第二件事

Handlerpost/postDelayed方法怎么执行才会通过?还是失败了?出于某种原因 - 其次,如果消息未放入消息队列,则可能会发生这种情况 - 失败,通常是因为处理消息队列的循环程序正在退出。

但您的语句很可能会产生无限循环

** ps。您需要在 try 块中抛出异常或删除 catch 块(因为 try{} finally{} )可以存在 "without" catch 但 catch 块中的代码没有引发任何异常将使编译器抱怨(代码将无法编译)

如果你想循环 n 次+1 你需要在 Runnable 运行() 方法中的 postDelayed 之前添加一些条件

在您的案例中代码流执行:

  1. 运行nable
  2. 定义之外最后一行的 postDelayed 方法
  3. 运行的执行可以通过:
    • try 块开始
    • 是否通过接球
    • through finally block with postDelayed in 运行nable 运行() 方法 - 这将在消息队列中放置 运行nable 以便在主线程上延迟执行
  4. 然后无限循环 2

so should i remove last postDelay out side of run() method to achieve postDelay run only ones in one loop. – 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);
        }
    });

so where should i call method to get done somthing ? in run() method..? – 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();

        }

运行() 方法中的代码在所谓的 UI 线程上同步执行 - 这是执行您的应用程序的主线程,请参阅:

https://developer.android.com/training/multiple-threads/communicate-ui.html

如果你有兴趣进一步研究它,我已经为你做了一个完整的工作示例:

https://gist.github.com/c3ph3us/7d237d540e60597369856cb1fa652a23