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

时间:2013-03-12 01:57:56

标签: java android multithreading final volatile

我试图找出我的用户界面何时正在运行,并且聪明地想要将一个runnable发布到uiThread,其唯一的工作就是设置一个标志。我尝试在volatile上使用uiIsRunning关键字,但eclipse不允许这样做,我还不明白。

但令我惊讶的是,当我在uiIsRunning上没有最终修饰符的情况下尝试下面的代码时,我被正确地告知我只能在嵌入类中使用局部变量,如果该局部变量是{{ 1}}。所以我做了final,令我惊讶的是,Eclipse对我的行uiIsRunning final完全没问题,那就是Eclipse认为我可以设置我的uiIsRunning = true;变量的值这个嵌套的类!

如果有人能告诉我我需要做什么来获得我想要的动作:在我当前的线程中将一个标志设置为false,然后当我发布它的线程执行它时将其设置为true,我将不胜感激。

final

4 个答案:

答案 0 :(得分: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;
            }
        });
    }
}

答案 1 :(得分:1)

当您将它用作标志时,您应该使用volatile关键字并将其设置为类的变量(而不是像您所做的那样将其设置为局部变量)。注意,volatile变量只能由唯一的线程修改。如果要通过多个线程对其进行修改,则应该查看同步或原子对象。

答案 2 :(得分:0)

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

private int sharedInt = 0;

public void someMethod() {

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

}

答案 3 :(得分:0)

  

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

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

cannot assign a value to final variable uiIsRunning

不是一个真正的问题。