2012-03-26 2 views
0

이 내 스레드 : 나는 (Application를 확장하는) 내 AppLoader 클래스의 정적 기능입니다 getIsInternetOn() 기능이변경 정적 변수는 효과가 없습니다

 public void run() { 
    Log.d("ConnectionThread","Starting Server Connection"); 
     try { 
      while(isThereActivityRunning()) { 
       if(AppLoader.getIsInternetOn() == true) 
       { 
        Log.d("ConnectionThread", "Internet is On. Sending Http request"); 
        results = sendGetMessage(); 
        b.putString("results", results); 
        receiver.send(2, b); 
       } 
       else 
        Log.d("ConnectionThread","Internet is Off. Sleeping"); 
       Thread.sleep(timeInterval); 
      } 

.

AppLoader 내 정적 부울 변수의 값을 false으로 변경할 때마다 위의 코드에 영향을 미치지 않는 것처럼 보입니다.

내 활동 안에 내가 동일한 기능을 가진보기에 동일한 변수를 변경할 수 있어요 있다는 이상한 것은 : 당신은 volatile로 부울 변수를 선언해야 할 수도 있습니다

 btn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (AppLoader.getIsInternetOn()) 
       AppLoader.setIsInternetOn(false); 
      else 
       AppLoader.setIsInternetOn(true); 
     } 

    }); 
    btn1.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (AppLoader.getIsInternetOn()) 
       internetStatus.setText("Internet is On"); 
      else 
       internetStatus.setText("Internet is Off"); 
     } 

    }); 

답변

0

volatile 수정자를 정적 변수에 추가하십시오.

UPD는 :

이 때문에 성능을 위해 값을 캐시의 일이있다.

+0

내가 무엇을 할 수 있습니까? 어떻게 스레드에서만 발생합니까 ?? –

+0

Thread는 변수의 값을 가져 와서 캐쉬하기 때문에 정적 변수를 선언 할 수 있습니다.'public static volatile boolean mNameOfVariable;' –

+0

ive 그것을 시도하면 작동하지 않습니다. im이 함수가 아니라 변수를 직접 호출하기 때문일 수 있습니까? –

관련 문제