0

私は Hello Android (Android PDF/チュートリアル) を使用していますが、この構文を数回見ました。run Runnable が定義されているときに使用される Java 構文を誰か説明してもらえますか?

private class AndroidBridge {

    public void callAndroid(final String arg) { // must be final
        handler.post(new Runnable() {
            public void run() {
                Log.d(TAG, "callAndroid(" + arg + ")" );
                textView.setText(arg);
            }
            ...

コードは Runnable オブジェクトを定義し、その run メソッドをオーバーライドしていますか?

4

3 に答える 3

2

RunnableDave Newton が示したように、これはインターフェイスを実装する匿名の内部クラスです。

なぜこれを使いたいのかというと、ある種の構文糖衣と考えることができます。あなたの例では、コードrun()は匿名の内部クラス自体が定義されている場所と同じスコープにアクセスできることに気付くでしょう。

これにより、これらのメンバーへのアクセスが簡素化されます。クラスを外部で定義した場合、呼び出し/使用するメンバーを持つオブジェクトへの参照を渡す必要があるためです。

実際、IIRC、これは Java が匿名の内部クラスをコンパイルするときに実際に起こることです。外側の包含クラスへの参照がある場合、コンパイラは、外側の包含クラスへの参照を渡すコンストラクターを作成します。

于 2012-11-23T01:33:30.563 に答える
2

この.postメソッドは Runnable オブジェクトを想定しています。このオブジェクトは、コード サンプルで匿名で宣言され、引数として渡されます。

これにより、長時間実行されるプロセスの新しいスレッドが開始されます。

スレッド コンストラクターには、スレッドの準備ができたときに呼び出されるメソッドRunnableを持つオブジェクトが必要です。run

多くの Java アプリが起動すると、UI を含むすべての操作が 1 つのスレッドに集中します。「重い」ことをしている場合にUIがフリーズするのを避けるために、主にスレッドを使用します。

「実行」などをクリックすると、UI が突然応答しなくなります。これは、現在のスレッドには、UI を構築し、「実行」が求めていることを実行するのに十分なリソースがないためです。

そのため、オブジェクトを必要とする別のスレッドで、別の場所で行われることがありRunnableます。

マルチスレッド (意図的に複数のスレッドを作成する) は、主に IMO のデバッグ上の理由から、操作が難しいことで知られていることに注意してください。しかし、もちろん便利なツールです。

于 2012-11-23T01:29:40.453 に答える
1

このコードは、Runnable インターフェイスを実装する匿名内部クラスを定義し、適切なアクションを実行する run メソッドを実装しています。

于 2012-11-23T01:33:54.847 に答える