gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:15:09 25 4
gpt4 key购买 nike

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

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

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

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

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

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

  • 第二件事

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

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

** 附言。您需要在 try block 中抛出异常或删除 catch block (因为 try{} finally{} )可以存在“没有”catch 但 catch block 中的代码没有引发任何异常将使编译器提示(代码将无法编译)

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

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

  1. runnable 定义之外最后一行的 postDelayed 方法
  2. 执行可运行的:
    • try block 的开始
    • 有或没有传 catch
    • 通过在 runnable run() 方法中使用 postDelayed 的 finally block - 这将把 runnable 放在消息队列中以便在主线程上延迟执行
  3. 然后无限循环 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();

}

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

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

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

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

关于android - 如果我使用 try catch 和 finally for handler 使用 runnable 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37957863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com