-1

我试图找出我的用户界面何时运行,并且有一个聪明的想法,即向 uiThread 发布一个可运行的对象,其唯一的工作就是设置一个标志。我尝试使用volatile关键字 onuiIsRunning但 eclipse 不允许这样做,我还不明白。

但令我惊讶的是,当我尝试下面没有使用 final 修饰符的代码时uiIsRunning,我被正确地告知我只能在嵌入式类中使用局部变量,如果该局部变量是final. 因此,令uiIsRunning final我惊讶的是,Eclipse 对我的行完全没uiIsRunning = true;问题,也就是说,Eclipse 认为我可以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

您可以通过在您的方法之外实例化它来访问多个线程中的字段(这种方式,而不是“局部变量”)。

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 回答
0

Runnable如何修改最终的局部变量

它不能。除非变量是成员变量,而不是局部变量,否则您的代码示例不会编译。

cannot assign a value to final variable uiIsRunning

不是一个真正的问题。

于 2013-03-12T09:15:48.333 回答