2012-03-26 9 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に変更すると、上記のコードには影響しないようです。

私の活動の内側に、私は同じ機能を持つビューに同じ変数を変更することができるよという奇妙なこと:

 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

スレッドは変数の値を受け取り、キャッシュします。これを避けるには、静的変数を宣言できます: 'public static volatile boolean mNameOfVariable;' –

+0

iveそれを試してみました。それは変数を直接呼び出すのではなく関数を呼び出すことができるからですか? –

0

あなたはvolatileとしてあなたのブール変数を宣言する必要がある場合があります。

関連する問題