2013-10-28 3 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는 다른 장소에 지정된 TextViews 있습니다. 3 Log 문을 확인하십시오. 여기에 이름 정확도를 위해 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' 클래스를 가지고 있다면 이것을 상상할 수 있습니다 -'static abstract class Runnable 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에 표시하려면 runOnUiThread를 실행해야합니다. 여기

은 예입니다

runOnUiThread(new Runnable() { 

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

View.post는 RunOnUiThread와 마찬가지로 작동합니다. – PearsonArtPhoto

관련 문제