2013-03-12 5 views
-1

Я пытался выяснить, когда работает мой пользовательский интерфейс, и имел умную идею опубликовать runnable для uiThread, единственным заданием которого было бы установить флаг. Я попытался использовать ключевое словона uiIsRunning, но eclipse этого не допустит, и я пока этого не понимаю.Как можно Runnable изменить конечную локальную переменную

Но, что удивительно, когда я пробовал код ниже без окончательного модификатора на 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; 
      } 
     }); 
+0

http://stackoverflow.com/questions/11424753/why-do-variables-passed-to-runnable-need-to-be-final – Geros

+0

Зачем вам использовать локальную переменную для нескольких потоков? – Hartok

+1

Вы не можете. Код не компилируется. Не настоящий вопрос. – EJP

ответ

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; 
      } 
     }); 
    } 
} 
+0

Думаю, он не может его изменить. Локальные поля, имеющие видимость внутри других потоков, объявленных внутри одного и того же метода, должны быть объявлены окончательными. –

+0

Два кодовых фрагмента запускались вместе; выяснены. – 323go

0

Вы можете получить доступ к поле в несколько потоков по Instancing его вне вашего метода (таким образом, не «локальная переменная»).

private int sharedInt = 0; 

public void someMethod() { 

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

} 
+0

Не отвечает на вопрос. – EJP

+0

Это почти то же самое, что и принятый ответ. –

1

Как вы используете его в качестве флага, вы должны использовать ключевое слово летучий и установить его в качестве переменной вашего класса (вместо локальной переменной, как вы это делали). Осторожно, изменчивая переменная должна быть изменена только с помощью уникальной нити. Если вы хотите изменить его более чем одним потоком, вы должны взглянуть на синхронизацию или на атомные объекты.

0

Как Runnable изменить конечную локальную переменную

Это не может. Образец кода не компилируется, если переменная не является переменной-членом, а не локальной переменной.

cannot assign a value to final variable uiIsRunning 

Не настоящий вопрос.

Смежные вопросы