2014-04-01 95 views
2

我的程序應該重複一個方法,直到按下按鈕。 我想這一點,但不工作:Android編程:我如何擺脫while循環?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    tts = new TextToSpeech(this, this); 
    Button button1 = (Button)findViewById(R.id.button1); 
    Button button2 = (Button)findViewById(R.id.button2); 
    button1.setOnClickListener(this); 
    button2.setOnClickListener(this); 
} 


public void onClick (View v){ 
    switch(v.getId()) { 
    case R.id.button1: 
     mainprogram(); 
     break; 
    case R.id.button2: 
     perform = false; 
     break; 
    } 
} 



public void mainprogram(){ 

    while(perform == true){ 
     speak(); 
     } 
    } 

(當然我編寫的「說話()」方法)

你能告訴我哪裏出了問題或者有任何方法解決它?

+0

你可以閱讀更多有關揮發性這裏。你可能想把方法代碼放到循環中,然後使用break;'在循環外部 – SMR

+0

使'perform'成爲'transient'。由於優化編譯器,while循環總是爲true。當你進入transient循環時,'perform'值會在進入while循環之前被檢查。 – Rahul

回答

0

我認爲問題是,你正在運行在同一個while循環線程你的聽衆和你的UI是因此,只要你的程序進入mainprogram(),它就會在這個循環中掛起,因爲它不能再對你的UI做出反應(因此,執行將始終爲true)!

您正面臨的問題可以通過在另一個線程中運行mainprogram()的內容來解決。

您的代碼可能是這個樣子:

class MainActivity extends Activity 
{ 
    //... 
    private static boolean perform; 

    private static getPerform() 
    { 
     return perform; 
    } 

    public void onClick (View v){ 
     switch(v.getId()) { 
      case R.id.button1: 
       perform = true; 

       Thread t = new SpeakThread(); 
       t.start(); 

       break; 

      case R.id.button2: 
       perform = false; 
       break; 
     } 
    } 
} 

class SpeakThread extends Thread 
{ 
    public void run() 
    { 
     while(MainActivity.getPerform()) 
     { 
      speak(); 
     } 
    } 
} 
0

要停止while循環只是使用break;

所以你的情況:

while(perform == true){ 
    speak(); 
    if(... somereason ...) break; 
} 

哪裏..​​. ... somereason應該是有效的代碼。

如果方法speak()是決定是否需要中斷的方法,只需將speak()的代碼直接放在while循環中而不是方法調用中即可。或者從發言返回false並檢查:if(!speak()) break;

+0

我知道,但有沒有像「waspressed()」按鈕的方法? – user3107025

+0

我不明白這個問題,當你點擊一個按鈕的方法onClick()得到執行(假設你已經添加了監聽器的按鈕或onClick屬性xml)。 – VM4

+0

這不是一個解決方案。他已經有執行變量來控制循環,爲什麼他需要這個?他的問題是,循環運行在UI線程上...查看我的答案。 – kupsef

0

由於mainprogram將在UI線程上運行,它將阻止所有UI,直到它從循環中斷開爲止。

單擊R.id.button2將不會響應(因爲UI線程被阻止),所以執行不會設置爲false。

執行MainProgram(主程序)關閉主線程,並單擊該按鈕會在某個時刻停止

4

的問題是,你的循環在UI線程上運行。我想整個UI凍結,當你開始循環。

你應該在一個單獨的線程上運行它。像:

case R.id.button1: 
    Thread th = new Thread(new Runnable(){ 
     public void run(){ 
      mainprogram() 
     } 
    }).start(); 
    break; 

而且,由於你修改從單獨的線程「執行」,你也應該讓儘快修改情況進行可變揮發,使更改其他線程可見。一旦你在你的while循環外的方法內 Do you ever use the volatile keyword in Java?