有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

(当然,我编程了“speak()”方法)

你能告诉我问题出在哪里吗?或者有什么方法可以解决它吗


共 (2) 个答案

  1. # 1 楼答案

    问题是循环在UI线程上运行。我猜当你开始循环时,整个UI都冻结了

    你应该在另一个线程上运行它。比如:

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

    此外,由于您从不同的线程修改了“perform”,所以还应该使perform变量可变,以便在修改发生时,其他线程可以看到这些更改

    你可以在这里阅读更多关于volatile的信息: Do you ever use the volatile keyword in Java?

  2. # 2 楼答案

    由于mainprogram将在UI线程上运行,它将阻塞所有UI,直到它从循环中断

    单击R.id.button2将不会响应(因为UI线程被阻止),因此执行不会设置为false

    在主线程外执行mainprogram,点击按钮将在稍后某个时间停止