Вырваться из метода из анонимного внутреннего класса - PullRequest
2 голосов
/ 13 марта 2012

У меня есть метод:

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(), чтобы вернуть логическое значение, а затем вернуть его с отрицательной кнопки, но он не позволит мне, потому что это внутри пустого внутреннего метода.
  • выдает исключение из ESCAPE для перехвата извне, но компилятор не разрешит мне, потому что DialogInterface.OnClickListener не выдает.
  • с помощью оператора break для выхода из forцикл, но это тоже не работает.

Также было бы приемлемо просто выйти из цикла for.Я могу объяснить это.Я перепробовал все, что смог найти, и я на грани ума.

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Вы можете выбросить RuntimeException или один из его подклассов. Компилятор не будет жаловаться на это.

1 голос
/ 13 марта 2012

Вы не находитесь в цикле, когда этот метод выполняется.Он может иметь доступ к объявленным там переменным (если они являются окончательными), но OnClickListener выполняется после того, как они щелкают, полностью за пределами / удалено из этого цикла.

1 голос
/ 13 марта 2012

Вы можете улучшить свой код с помощью:

// 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 есть и другие методы, такие как обработчики и т. Д.

...