我有一个方法:
void someMethod(String someString)
final String[] testAgainst = {...};
....
for(int i = 0; i < testAgainst.length; i++) {
if (someString.equals(testAgainst[i])) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Strings are the same! Overwrite?")
.setTitle("Blah Blah Blah")
.setCancelable(false)
.setPositiveButton("Overwrite", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface di, int which) {
someAction()
}
})
.setNegativeButton("Nah", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface di, int which) {
ESCAPE
}
});
AlertDialog dialog = builder.create();
}
}
doSomeOtherStuff();
}
如果我的代码到达ESCAPE
(即用户决定不覆盖),我就想完全退出该方法。我试过......
someMethod()
以返回布尔值,然后从否定按钮返回它,但它不会让我,因为它在void内部方法中。ESCAPE
抛出异常以便从外部捕获,但编译器不会让我因为DialogInterface.OnClickListener
没有抛出。break
语句离开for
循环,但这也不起作用。简单地离开for
循环也是可以接受的。我可以解释这一点。我已经尝试了所有我能找到的东西,而且我的目标已经结束了。
答案 0 :(得分:3)
您可以抛出RuntimeException或其子类之一。编译器不会抱怨它。
答案 1 :(得分:1)
您可以使用以下方法增强代码:
// Static class that contains nothing but a trigger to exit the loop
static class Cancel { boolean shouldCancel = false; }
void someMethod(String someString)
final String[] testAgainst = {...};
....
// Initialize it `final`, else it won't be accessible inside
final Cancel trigger = new Cancel();
// Add the check as additional condition for the `for` condition
for(int i = 0; i < testAgainst.length && !trigger.shouldCancel; i++) {
if (someString.equals(testAgainst[i])) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Strings are the same! Overwrite?")
.setTitle("Blah Blah Blah")
.setCancelable(false)
.setPositiveButton("Overwrite", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface di, int which) {
someAction()
}
.setNegativeButton("Nah", new DialongInterface.OnClickListener() {
public void onClick(DialogInterface di, int which) {
// Use the trigger to communicate back that it's time to finish
trigger.shouldCancel = true;
}
AlertDialog dialog = builder.create();
}
}
doSomeOtherStuff();
}
Android也有其他方法可以做到这一点,比如Handlers等。
答案 2 :(得分:1)
当该方法执行时,您不在循环中。它可以访问在那里声明的变量(如果它们是最终的),但OnClickListener在它们单击后执行,完全在该循环之外/从该循环中移除。