在一个活动中,我有这种递归方法:
private void startThread(final int i){
if(i < length){
TaskCross taskCross = new TaskCross();
TaskScreenshot taskScreenshot = new TaskScreenshot(i);
TaskNoise taskNoise = new TaskNoise();
TaskEditText taskEditText = new TaskEditText();
handler.postDelayed(taskCross, 1000);
handler.postDelayed(taskScreenshot, 2000);
handler.postDelayed(taskNoise, 2100);
handler.postDelayed(taskEditText, 3000);
myEditText.setOnKeyListener(new View.OnKeyListener(){
public boolean onKey(View v, int keyCode, KeyEvent event) {
System.out.println("KEY ENTER!!!!!");
if((keyCode == KeyEvent.KEYCODE_ENTER)) {
if(myEditText.getText().toString().equals("")){
Toast.makeText(getApplicationContext(), "Inserire un numero da 1 a 9", Toast.LENGTH_SHORT).show();
return false;
} else if (Integer.parseInt(myEditText.getText().toString()) >= 1 &&
Integer.parseInt(myEditText.getText().toString()) <= 9){
startThread(i+1);
return true;
}
}
return false;
}
});
}
}
让我们说变量length
的值是5
;结果的顺序是:
TaskCross
TaskScreenshot(0)
TaskNoise
TaskEditText
TaskCross
TaskCross
TaskScreenshot(1)
TaskScreenshot(2)
TaskNoise
TaskNoise
TaskEditText
TaskEditText
TaskCross
TaskCross
TaskScreenshot(3)
TaskScreenshot(4)
TaskNoise
TaskNoise
TaskEditText
TaskEditText
但我想要的结果是:
TaskCross
TaskScreenshot(0)
TaskNoise
TaskEditText
TaskCross
TaskScreenshot(1)
TaskNoise
TaskEditText
TaskCross
TaskScreenshot(2)
TaskNoise
TaskEditText
TaskCross
TaskScreenshot(3)
TaskNoise
TaskEditText
TaskCross
TaskScreenshot(4)
TaskNoise
TaskEditText
TaskEditText
是一个扩展Runnable
的类;此类会折叠ImageView
并显示EditText
。在此EditText
中,当用户按下键盘的Enter键时,该方法将被递归调用。
该方法的第一次调用是startThread(0)
所以,我的问题是:这个方法我做错了什么?我是否以正确的方式使用postDelayed
方法?
谢谢!
答案 0 :(得分:0)
一旦你进入Thread
的世界,你就不能指望事情就像你只有一个线程一样。事情并行运行,这意味着默认情况下它们将按原样运行,这意味着,首先处理事物是第一次吐出结果。
但是,您可以通过排除实例甚至方法来更改该行为,因此在使用它们的线程释放实例或方法之前,没有人可以触摸结构或输入方法。这将是synchronized
的情况,您将能够找到更多信息here。非常谨慎地使用它,你还需要确切知道何时使用它,否则你很可能会陷入僵局。
注意:如果您计划使用synchronized
块,我不会在递归函数中使用线程和处理程序。最好使用循环。