我正在写一个教育数学游戏,你可以同时选择很多操作,现在我试图生成 5 个问题,但是它运行所有五个问题的速度太快了,除了最后一个问题我无法回答它们,因为它卡在那里.所以我想创建一个线程,在创建第一个问题后等待()并等到它被解决并正确回答,然后继续下一个问题等等......现在我从来没有使用过等待和通知所以在哪里我应该分配给他们吗 这是我到目前为止所得到的,但是它给了我一个异常(exception):
while (counter < 5) {
Thread pause = new Thread() {
@Override
public void run() {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} finally{
// ops array is for knowing what operation he chose,
// 1 for plus and 2 for minus
//generate random number within the range of the operations length.
int gen = Integer.valueOf((int) ((Math.random() * (ops.length))));
Log.d("Testgen", String.valueOf(gen));
//random operation is generated
int TheChosenOperation = ops[gen];
Log.d("Test The chosen", String.valueOf(TheChosenOperation));
switch (TheChosenOperation) {
case 1: // if it is plus, assign the generated numbers to i and j from plus.java
Toast t = Toast.makeText(SecondActivity.this, "Plus", 5000);
t.show();
tv.setText("+");
int i = plus.getBorder();
int j = plus.getBorder2();
tv2.setText(String.valueOf(i));
tv3.setText(String.valueOf(j));
answer = plus.getAnswer();
break;
case 2: //if it is minus, assign the generated numbers to i and j from minus.java
Toast t2 = Toast.makeText(SecondActivity.this, "minus", 5000);
t2.show();
tv.setText("-");
int i2 = minus.getBorder();
int j2 = minus.getBorder2();
tv2.setText(String.valueOf(i2));
tv3.setText(String.valueOf(j2));
answer = minus.getAnswer();
break;
}
b.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (answer > 0 && answer == Integer.parseInt(ed.getText().toString())) {
Toast t = Toast.makeText(SecondActivity.this, "true",
5000);
t.show();
this.notify(); // if the answer is true then notify()
} else {
Toast t = Toast.makeText(SecondActivity.this, "false",
5000);
t.show();
}
}
}); // end of clicklistner
counter++; // counting for 5 questions
}//finally
}//run
}; // end of thread
pause.start();
} //end of while loop
我对 android 和线程还是新手,所以请耐心等待。 提前致谢,对不起我糟糕的英语。
最佳答案
Thread
在此上下文中的用法并不正确。
- 有一个主线程或 UI 线程负责呈现和管理 UI 状态。如果您想对
TextView
、Button
等 UI 元素进行任何更改,则必须在此线程中进行。如果您在此线程中保留持续时间较长的任务或让此线程等待,您的应用程序将变得无响应并且 Android 操作系统将显示一个 ANR 对话框。 (在 Keeping Your App Responsive 中阅读更多相关信息) Thread
通常在有并发任务要执行的时候使用。在这种情况下,任务并不是真正并发的,而是顺序的。
你应该更多地考虑事件驱动的方法,应用程序根据事件做出决定(比如回答的问题,可以用来检查有多少问题已经回答,以决定你是否需要生成更多的问题) .
关于android - android 线程中的 wait() 和 notify(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16670949/