【问题标题】:handler on a recursive function递归函数上的处理程序
【发布时间】:2014-02-08 16:51:10
【问题描述】:


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

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

谢谢!

【问题讨论】:

    标签: java android runnable android-handler


    【解决方案1】:

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

    但是,您可以通过专门阻塞实例甚至方法来更改该行为,因此在使用它们的线程释放实例或方法之前,没有人可以触摸结构或输入方法。那将是synchronized 的情况,您将能够找到更多信息here。使用它时要格外小心,您还需要确切知道何时使用它,否则您很可能会遇到死锁。

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

    【讨论】:

    • 我尝试添加synchronized,但结果始终相同;所以我会尝试循环
    • synchronized + 递归的组合绝对是一个非常糟糕的组合。如果您期望连续的结果,您不能简单地避免在您的情况下使用线程吗?如果没有,可能还有另一个阻止工具可以帮助您:CountDownLatchdeveloper.android.com/reference/java/util/concurrent/…
    • 是的,我可以尽量避免线程,但我不知道如何;无论如何,我会尝试使用CountDownLatch
    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 2021-06-24
    • 2015-02-20
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    相关资源
    最近更新 更多