处理递归函数

时间:2014-02-08 16:51:10

标签: java android runnable android-handler


在一个活动中,我有这种递归方法:

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方法?

谢谢!

1 个答案:

答案 0 :(得分:0)

一旦你进入Thread的世界,你就不能指望事情就像你只有一个线程一样。事情并行运行,这意味着默认情况下它们将按原样运行,这意味着,首先处理事物是第一次吐出结果。

但是,您可以通过排除实例甚至方法来更改该行为,因此在使用它们的线程释放实例或方法之前,没有人可以触摸结构或输入方法。这将是synchronized的情况,您将能够找到更多信息here。非常谨慎地使用它,你还需要确切知道何时使用它,否则你很可能会陷入僵局。

注意:如果您计划使用synchronized块,我不会在递归函数中使用线程和处理程序。最好使用循环。