如果我使用 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 之前添加一些条件
在您的案例中代码流执行:
- 运行nable
定义之外最后一行的 postDelayed 方法
- 运行的执行可以通过:
- try 块开始
- 是否通过接球
- through finally block with postDelayed in 运行nable 运行() 方法 - 这将在消息队列中放置 运行nable 以便在主线程上延迟执行
- 然后无限循环 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
我使用下面的代码在一段时间间隔后每次完成一些工作,并在 '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 之前添加一些条件
在您的案例中代码流执行:
- 运行nable 定义之外最后一行的 postDelayed 方法
- 运行的执行可以通过:
- try 块开始
- 是否通过接球
- through finally block with postDelayed in 运行nable 运行() 方法 - 这将在消息队列中放置 运行nable 以便在主线程上延迟执行
- 然后无限循环 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