2013-10-28 68 views
0

我有一個例程,我用它來設置文本視圖。它對名稱進行一些名義處理,填充空白等。另外,它使用View.Post在UI線程上運行。以下是所述功能的相關部分:爲什麼我的值沒有保存到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是在其他位置指定的TextView。注意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

這很奇怪。我只能想象如果你有自己的具有'value'作爲實例變量的'Runnable'類,就會發生這種情況 - 靜態抽象類Runnable implements java.lang.Runnable {String value; }'。你能檢查進口嗎? ' –

+0

這很奇怪。你在代碼的其他任何地方(即全局變量)中使用「value」這個名字嗎? – 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

如果您想要顯示對UI的價值或任何影響,您應該運行theard RunOnUiThread。

這裏是例子:

runOnUiThread(new Runnable() { 

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

View.post和RunOnUiThread一樣。 – PearsonArtPhoto

相關問題