-1

私は自分のユーザー インターフェイスがいつ実行されているかを調べようとしていましたが、唯一の仕事がフラグを設定する uiThread に runnable を投稿するという巧妙なアイデアがありました。volatileon というキーワードを使用しようとしましuiIsRunningたが、Eclipse では許可されず、まだ理解できません。

しかし、私にとって驚くべきことは、次のコードを final 修飾子なしで試してみたところ、uiIsRunningそのローカル変数がfinal. だから私はuiIsRunning final驚いたことに、Eclipseは私の行でまったく問題ありません。つまり、Eclipseは、このネストされたクラス内uiIsRunning = true;で変数の値を設定しても問題ないと考えています!final

誰かが私が望むアクションを得るために何をする必要があるかを教えてくれるなら: 現在のスレッドでフラグを false に設定し、それを投稿しているスレッドがそれを実行するときに true に設定します。

        final boolean uiIsRunning = false;
        uiHandler.post(new Runnable() {
            @Override
            public void run() {
                uiIsRunning = true;
            }
        });
4

4 に答える 4

4

final変数を変更できるように見えるのは奇妙です。しかし、もっと重要なことは、あなたの場合にできることは次のとおりです。

public class SurroundingActivity extends Activity {

    volatile boolean uiIsRunning = false;
    private Handler uiHandler;

    void someMethod () { 
        uiHandler.post(new Runnable() {
            @Override
            public void run() {
                SurroundingActivity.this.uiIsRunning = true;
            }
        });
    }
}
于 2013-03-12T02:08:47.120 に答える
1

フラグとして使用しているため、volatile キーワードを使用して、(ローカル変数の代わりに) クラスの変数として設定する必要があります。注意: volatile 変数は、固有のスレッドによってのみ変更されるべきです。複数のスレッドで変更したい場合は、同期またはアトミック オブジェクトを調べる必要があります。

于 2013-03-12T02:14:03.870 に答える
0

Runnableはどのようにして最終的なローカル変数を変更できますか

できません。変数がローカル変数ではなくメンバー変数でない限り、コードサンプルはコンパイルされません。

cannot assign a value to final variable uiIsRunning

本当の質問ではありません。

于 2013-03-12T09:15:48.333 に答える
0

メソッドの外でインスタンス化することにより、複数のスレッド内のフィールドにアクセスできます (この方法では、「ローカル変数」ではありません)。

private int sharedInt = 0;

public void someMethod() {

    // sharedInt will be visible inside this thread.
    Thread thread = new Thread(new Runnable() {....});

}
于 2013-03-12T02:09:06.900 に答える