2013-10-28 4 views
0

У меня есть обычная программа, которую я использую для установки текстовых представлений. Он выполняет некоторую номинальную обработку имен, заполнение пробелов и т. Д. Кроме того, он работает в потоке пользовательского интерфейса, используя View.Post. Вот соответствующие части указанной функции:Почему моя ценность не сохраняется в Runnable?

public void setValue(final String value) 
{ 
    Log.v(TAG,"Name="+ mFieldName.getText()+" value="+value); 
    //Log.v(TAG,unknown); 
    mValue.post(new Runnable(){ 
     @Override 
     public void run() { 
      Log.v(TAG,"Start: Name="+ mFieldName.getText()+" value="+value); 
      if (value==null) 
       mValue.setText(R.string.loading); 
      else 
       mValue.setText(value); 
      Log.v(TAG,"Posted: Name="+ mFieldName.getText()+" value="+mValue.getText()); 
     } 
    }); 

MVALUE и mFieldName является TextViews, указанным в других местах. Обратите внимание на 3 оператора журнала. Вот 3 для точности Название:

10-27 22:27:49.491: V/OOP(19865): Name=Accuracy value=25.0 m 
10-27 22:27:50.171: V/OOP(19865): Start: Name=Accuracy value=null 
10-27 22:27:50.171: V/OOP(19865): Posted: Name=Accuracy value=Finding... 

У меня очень трудно понять, как значение может быть изменено на всех в процессе создания работоспособной. Есть предположения?

+0

Я думаю, что выше журнал возможно, если вы вызовите метод 'setValue' более чем один раз (последовательно, например, в петле). Вы это делаете? –

+0

Это странно. Я могу только представить, что это происходит, если у вас есть свой собственный класс Runnable, который имеет значение 'value' как переменную экземпляра -' static abstract class Runnable реализует java.lang.Runnable {String value; } '. Можете ли вы проверить импорт? ' –

+0

Это странно. Используете ли вы имя «значение» где-либо еще в своем коде (т. Е. В глобальной переменной)? – Luis

ответ

0

Похоже, что происходит в том, что setValue был вызван несколько раз, не будучи закончена. Я помешал этому, проверив его и добавив класс boolean viewChangePending. Я мог бы, вероятно, сделать это так же легко, с фиксирующей резьбой, но это, кажется, сделать трюк, так что ...

public void setValue(final String value) 
{ 
    final String fieldName= new String((String) mFieldName.getText()); 
    Log.v(TAG,"Name="+ fieldName+" value="+value); 
    //Log.v(TAG,unknown); 
    try { 
     while(viewChangePending) 
       Thread.sleep(1); 
    } catch (InterruptedException e) { 
     } 
    viewChangePending=true; 
    mValue.post(new Runnable(){ 
     @Override 
     public void run() { 
      Log.v(TAG,"Start: Name="+ fieldName+" value="+value); 
      if (value==null) 
       mValue.setText(R.string.loading); 
      else 
       mValue.setText(value); 
      Log.v(TAG,"Posted: Name="+ fieldName+" value="+mValue.getText()); 
      viewChangePending=false; 
-1

Если вы хотите показать значение или что-либо навредить пользовательскому интерфейсу, вы должны запустить программу RunOnUiThread.

Вот пример:

runOnUiThread(new Runnable() { 

    @Override 
    public void run() { 
     //YOUR CODE HERE 
    } 
}); 
+1

View.post работает так же, как и RunOnUiThread. – PearsonArtPhoto

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