2014-04-01 50 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?