0

return;内部関数から外部関数の値 (または単に) を返す方法はありますか?

私の質問は、この質問に似ています: 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.

}
4

2 に答える 2

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

于 2013-09-10T19:44:01.980 に答える
0

質問を理解しているかどうかわかりません。しかし、あなたはマルチスレッドにあまり慣れていないと思います。

内部Runnableのコードと呼び出し後のコードは、runOnUiThread実際には同時に実行されますが、異なるスレッドで実行されます。したがって、ネストされたループやシングルスレッドのネストされたメソッド呼び出しからは何光年も離れています。

実際には別のスレッドに「ブロッキング」呼び出しを行って値を待つことができますが、これをすべてスタックオーバーフローの回答に書き出すのは適切ではないと思います。マルチスレッドについてよく読んでください。 Java Concurrency in Practiceを強くお勧めします。ただし、これは数日で理解できるような些細なトピックではないことに注意してください。このチュートリアルもご覧ください。インターフェイスFutureは、私が言及していた「ブロッキング」呼び出しを実装します。

編集
上記の考え方をJavaで書きました。Futureを使用するには、UI スレッドの を取得する必要があるため、Android の場合はさらに複雑になりExecutorServiceます。それが可能かどうかはわかりません。

多くの Android 固有のマルチスレッド コンストラクトがあります (たとえば、このチュートリアルまたは公式ドキュメントを参照してください)。あなたの問題を解決することは確かに可能ですが、十分な詳細がありません。また、問題の簡単な解決策を見つけようとするのではなく、Android のマルチスレッド パラダイムに自然に収まるように設計全体を再考する必要があります。

于 2013-09-10T20:47:41.657 に答える