2013-09-10 3 views
0

Есть ли способ вернуть значение (или просто return;) для внешней функции из внутренней функции?Возвращаемое значение (или ничего) для внешней функции из внутренней функции вложенных функций в Java

Мой вопрос похож на этот вопрос: Breaking out of nested loops in Java, но разница в том, что в этом вопросе Аскер вопроса о нарушении внешнего цикла в вложенных циклах, и я прошу о возвращении к внешней функции во вложенных функциях.

public void outerFunction() 
{ 
    runOnUiThread (new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      // Here i want to return;, so the function will not continue after runOnUiThread 
     } 
    }); 

    // Code here should not run. 

} 
+2

То, что вы ищете, представляет собой экземпляр раздражающего потока как часть вызова метода, а не функцию/метод внутри функции/метода. – kosa

ответ

1

Метод runOnUiThread принимает Runnable аргумент. Мы можем предположить, что он использует свой метод run(). Например, если метод был

public void runOnUiThread(Runnable runnable) { 
    // do a bunch of stuff 
    // some more logic 
    runnable.run(); 
    // more logic 
    return; 
} 

Вы не можете заставить return метода вызова (runOnUiThread()) от вызываемого метода (run()). Однако вы можете выкинуть Exception внутри вызываемого метода, который остановит все выполнение, но вы не будете знать, где это поймано.

0

Я не уверен, что понял вопрос. Но я предполагаю, что вы не очень хорошо разбираетесь в многопоточности.

Код в пределах Runnable и код после звонка runOnUiThread фактически выполняются в одно и то же время, но в разных потоках. Таким образом, это светлые годы от вложенных циклов или от однопоточных вложенных методов.

Вы можете сделать «блокирующий» вызов в другом потоке, чтобы дождаться значения, но я не думаю, что это нужно написать все это в ответе stackoverflow. Вы должны прочитать многопоточность, и я настоятельно рекомендую Java Concurrency in Practice. Но вы должны быть предупреждены, что это не тривиальная тема, которую вы можете забрать за несколько дней. Вы также можете посмотреть this tutorial; интерфейс Future реализует «блокирующий» вызов, к которому я имел в виду.

EDIT
Я написал выше мышление на Java. С Android все сложнее, так как для использования Future вам нужно будет получить ExecutorService для потока пользовательского интерфейса, и я не уверен, что это возможно.

Существует множество специфичных для Android многопотоковых конструкций (см., Например, this tutorial или официальный документ). Конечно, вы можете решить свою проблему, но у нас недостаточно информации. Кроме того, вы, вероятно, не должны пытаться найти быстрое решение своей проблемы, но переосмыслите весь свой дизайн, чтобы он естественным образом соответствовал многопоточной парадигме Android.

Смежные вопросы