2013-07-31 76 views
0

在我的程序中,一個布爾值(稱爲metronomeOn)應該在單擊一個按鈕時設置爲true,而在單擊不同按鈕時爲false。我擁有的唯一類(MainActivity)實現了Runnable。所以在線程開始之後,在run方法中,根據metronomeOn的值,它應該執行一段代碼。我的問題是,在應該將metronomeOn設置爲true的按鈕的onClick方法之後,metronomeOn的值不會改變。Android:布爾值不變?

ButtonListeners(該方法在所謂的onCreate):

public void ButtonListeners() { 
    bStart.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      metronomeOn = true; 
     } 
    }); 

    bStop.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      currentBeatIndex = 1; 
      tvCurrentBeatIndex.setText(""); 
      metronomeOn = false; 
     } 
    }); 
} 

run方法:

if (metronomeOn) { 
     tvBpm.setText("IN IF STATEMENT"); 
     //other code... 
    } 

我完全不知道爲什麼metronomeOn未切換值。我知道run方法會被執行,而且節拍器只會在onCreate和onDestroy中被更改。任何想法爲什麼這不起作用?提前致謝!!

編輯* * ** * ** * ** * ** * ** * ** * ** * ** * ** 我已經擺脫了運行方法和Runnable類的實現,所以這裏沒有問題,但節拍器仍然總是返回false。

再次編輯* * ** * ** * ** * ** * ** * ** * ** * * 我不知道爲什麼或如何,但刪除Runnable的東西,並重新啓動Eclipse後,它現在的作品。 MetronomeOn改變價值!感謝所有給予建議的人!

+0

你能記錄並確保調用「ButtonListeners」嗎? (你可以將pastebin.com放在你的整個班上。)'活動實現了Runnable'聞起來很臭。 – ataulm

+0

你可以放置你已經聲明布爾值的代碼嗎? – JNL

回答

0

多種可能的原因:

  • 是metronomeOn volatile?如果跨線程使用變量,則應標記它。
  • 你的跑步方法檢查節拍​​器多次?從您發佈的代碼中,它只被檢查一次
  • 您是否按照您認爲的那樣執行了run方法?就像它設置了metronomeOn一樣,你的Activity也會崩潰,因爲你只能從UI線程訪問GUI。只是使類實現Runnable不會導致線程產生。你可以不用線程直接調用run方法。

從我們看到您的應用程序的小部件中,我想您可能想使用服務而不是線程/ Runnables?服務可以開始和停止,獨立於Activity運行,也可以產生線程。

由於您無法訪問服務中的活動,因此您可以使用Log類中的Android日誌記錄方法執行調試輸出。

+0

我真的很感謝這篇文章的幫助,但遺憾的是它沒有奏效。我甚至已經擺脫了整個可運行/運行的東西。即使在那之後,在onClick方法完成後,節拍器仍然總是返回false。 – hardyboy16jm

+0

如果您可以發佈活動的代碼(或者甚至更好:代碼中的所有相關部分,並且刪除了周圍的東西),如果仍然存在未按預期工作的情況,這將會很有幫助。 – dst

0

無法弄清楚確切的問題,但嘗試相反的方式。將它們命名爲method1method2,並使用as--

public void method1(View v) { 
\\code for button1 
} 

public void method2(View v) { 
\\code for button2 
} 

以XML使用相應的按鈕:

android:onClick="method1" 
android:onClick="method2" 
+1

「解決」問題而不瞭解罪魁禍首是愚蠢的 –