繁体   English   中英

如何使 for 循环等待事件处理程序完成? Android

How to make the for loop wait for an event handler to finish? Android

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个迭代 10 次的循环。 每次我更新问题和选择并检查正确的选择。 问题是,循环不会等待setOnClickListner完成其工作。 它只是忽略它并迭代到最后,此外,如果我将counter放在侦听器中,它只会进入无限循环并且屏幕变暗。 我怎样才能克服这个?

注意: counter已全局声明。

 for(;counter<10;counter++){
        questionTv.setText(questions[counter]);
        questionImage.setImageResource(images[counter]);
        choice1.setText(choices[counter][0]);
        choice2.setText(choices[counter][1]);
        choice3.setText(choices[counter][2]);
        choice4.setText(choices[counter][3]);
        choice1.setEnabled(true);
        choice2.setEnabled(true);
        choice3.setEnabled(true);
        choice4.setEnabled(true);
        choicesRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){
            @Override
            public void onCheckedChanged(RadioGroup group,int checkedId){
                switch(checkedId){
                    case R.id.choice1:{
                        checkAnswer(answers,choice1,choice2,choice3,choice4,scoreTv); //a method to check the answer and do necessary modification. 
                        break;
                    }
                    case R.id.choice2:{
                        checkAnswer(answers,choice2,choice1,choice3,choice4,scoreTv);
                        break;
                    }
                    case R.id.choice3:{
                        checkAnswer(answers,choice3,choice2,choice1,choice4,scoreTv);
                        break;
                    }
                    case R.id.choice4:{
                        checkAnswer(answers,choice4,choice2,choice3,choice1,scoreTv);
                        break;
                    }
                }
            }
        });
    }
1 个回复

但是,就像我在评论中所说的那样,很快就可以使用 Android 组件来设计更好的方法来完成您正在做的事情,而无需循环。

你有一个问题列表,并且可以预见问题 go 从 1 到 10(在你的情况下),所以让我们在每次调用checkAnswer并随后刷新视图后增加问题编号:

private void setQuestions(int questionNum) {
        questionTv.setText(questions[questionNum]);
        questionImage.setImageResource(images[questionNum]);
        choice1.setText(choices[questionNum][0]);
        choice2.setText(choices[questionNum][1]);
        choice3.setText(choices[questionNum][2]);
        choice4.setText(choices[questionNum][3]);
        choice1.setEnabled(true);
        choice2.setEnabled(true);
        choice3.setEnabled(true);
        choice4.setEnabled(true);
        choicesRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){
            @Override
            public void onCheckedChanged(RadioGroup group,int checkedId){
                switch(checkedId){
                    case R.id.choice1:{
                        checkAnswer(answers,choice1,choice2,choice3,choice4,scoreTv, questionNum); //a method to check the answer and do necessary modification.
                        break;
                    }
                    case R.id.choice2:{
                        checkAnswer(answers,choice2,choice1,choice3,choice4,scoreTv, questionNum);
                        break;
                    }
                    case R.id.choice3:{
                        checkAnswer(answers,choice3,choice2,choice1,choice4,scoreTv, questionNum);
                        break;
                    }
                    case R.id.choice4:{
                        checkAnswer(answers,choice4,choice2,choice3,choice1,scoreTv, questionNum);
                        break;
                    }
                }
            }
        });
    }

private void checkAnswer(List<String> answers, 
                         boolean choice1, 
                         boolean choice2, 
                         boolean choice3, 
                         boolean choice4, 
                         TextView scoreTv,
                         int questionNum) {
    // Do stuff
    setQuestions(questionNum++);
}
1 等待事件处理程序完成,然后继续

假设我有一个名为A的用户控件,它执行以下操作: A的实例保存在预订ListPrepared事件并修改创建的列表的页面中。 很显然,我希望页面的处理程序在操作并显示列表之前完成,因为它正在修改列表以保持完整性。 我将如何实施呢? (或者这是一个可怕的想法,因为它公开了列表,因此需要外 ...

2 等待事件处理程序

所以这里是删除和事件 订阅者(多个) 事件电话 问题是即使DoSomething没有完成,最后一部分也会继续。 会出现什么问题? ...

3 如何使Jquery自动完成结果事件处理程序起作用?

我编写的代码在用户选择有效的内容后(以下)无法使用JQuery自动完成功能来触发结果函数。 结果,我的意思是结果处理程序,该函数会在自动完成插件中进行良好选择后触发。 记录在这里 。 就我而言,我的表单实际上是一个表,其中每一行都是相同的,减去以下字段上的唯一ID:Item1,Qt ...

4 事件处理程序和循环

我有一个播放简单动画的全屏窗口,我想制作一个全屏窗口,以便当我按任意键时,将恢复全屏并且程序停止。 关键侦听器类如下所示: 导入java.awt.event。*; 公共类密钥实现KeyListener { } 动画在方法中运行,并运行while循环,如下所示: ...

5 等待 javascript 事件处理程序

我正在努力处理 javascript 中的事件处理程序,我试图通过异步/等待使事情正确响应。 下面代码中的问题与file.on事件有关——我正在努力正确地承诺它。 目前checkSomething方法在file.on处理程序完成之前返回,因此returnValue始终为false 。 我可以使用一些 ...

6 如何等待事件处理程序被设置

C1 类具有以下特性: C2类有这个: 有时 handleConfig 不会运行。 就好像尚未设置 Config 事件处理程序一样。 它仅在执行开始时发生,并且仅在某些时候发生。 有没有办法在使用 Invoke 之前等待事件处理程序被设置? ...

2020-08-06 07:42:12 0 31   c#
7 等待事件处理程序的执行

我有一个数据存储库,为我的应用程序的模型提供持久层。 对光盘的所有访问都是异步的,因此我的整个持久层都是用async / await编写的。 我的数据存储库允许其他模块订阅数据中的更改: 当我告诉存储库删除其他对象引用的对象时,它也会删除这些其他对象。 此设置在某种程度上有效 ...

8 等待事件处理程序的异步

我很困惑如何最好地处理这种情况。 我不想等待异步调用的响应。 具体来说,我有: 这按预期工作。 但是,如果超时到期,则不得调用ReadQueue.EndReceive,否则将引发异常。 显然,FromAsync并不知道这一点并盲目地调用它 - 解雇异常。 不要在超时时调用End ...

9 如何等待事件处理程序调用?

基本上,我有一个调用事件处理程序的方法。 事件处理程序调用异步方法,我需要知道该方法的结果(真或假)。 由于事件处理程序只能返回 void,因此我创建了自己的 eventargs 并带有一个成功属性,如果它正确,我在该方法中将其设置为 true。 SomeEvent 连接到 SomeEventH ...

10 等待来自事件处理程序的某些数据

我正在调用一个外部可执行文件,并从其标准输出流异步读取。 我需要等待流中传递一些数据。 一种简单的解决方案是使用一个同步标志,使用锁来访问它,并设置一个无限周期,当设置该标志时,该无限周期会中断。 有没有更优雅,更安全的方法来做到这一点? 这是我要完成的工作: ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM