2012-03-26 110 views
0

這是我的線程:改變應用程序線程靜態變量沒有效果

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

我有getIsInternetOn()功能這是在我的AppLoader類的靜態函數(延伸Application)。

由於某些原因,每當我將AppLoader中的靜態布爾變量的值更改爲false時,它似乎不會影響上面的代碼。

怪異的事情,我的活動中,我能夠改變的視圖具有相同功能的同一個變量:

 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

我該怎麼辦?以及它如何只發生在線程中? – 2012-03-26 17:22:00

+0

線程獲取變量的值並緩存它,爲了避免它,你可以像這樣聲明你的靜態變量:'公共靜態變量boolean mNameOfVariable;' – 2012-03-26 17:23:14

+0

我試過了,它沒有工作。它可以是因爲我直接調用一個函數而不是變量? – 2012-03-26 17:52:10

0

您可能需要聲明你的布爾變量爲volatile